首页 > 其他分享 >编辑距离

编辑距离

时间:2024-02-27 21:35:02浏览次数:24  
标签:字符 第二个 字母 距离 变为 编辑 字符串 AGT

p2758-编辑距离

思路:
用f[i][j]表示第一个字符串的前 i 个字母变为第二个字符串的前 j 个字母所用的最少操作次数。

假设第一个字符串为AGTCTGACGC

第二个字符串为:AGTAAGTAGGC

f[3][5] 表示把第一个字符串的前三个字母变为第二个字符串的前五个字母所需要的最少操作次数

也就是把AGT变为AGTAA所用的最少操作次数。

分析递推方程

把第一个字符串的前 i 个字母变为第二个字符串的前 j 个字母,有三种方法:

image

把第一个字符串的前 i 个字母变为第二个字符串的前 j - 1 个字符,然后在第一个字符串后面增加第二个字符串的第j个字母。

这种情况下,f[i][j] = f[i][j - 1] + 1

例如:把AGT变为AGTAA,可以先把AGT变为AGTA,然后再在最后面添加一个字符A

把第一个字符串的前 i - 1 个字母变为第二个字符串的前 j 个字符,然后去掉最后一个字符。

例如:把AGT变为AGTAA,可以先把AGT变为AGTAAT,然后再去掉一个字符T

这种情况下,f[i][j] = f[i - 1][j] + 1

把第一个字符串的前 i - 1 个字母变为第二个字符串的前 j - 1个字符。变化之后,对比最后一个字符,如果相等,则变换完成,如果不同,把第一个字符串的最后一个字符变为第二个字符串的最后一个字符,

例如:把AGT变为AGTAA,可以先把AGT变为AGTAT,然后再在最后面添加一个字符T变为A

例如:把AGT变为AGTAT,可以先把AGT变为AGTAT,因为最后一个字符相同,不再做处理。

这种情况下,f[i][j] = f[i - 1][j - 1] + 1(最一个字符不同) 或f[i][j] = f[i - 1][j + 1] (最一个字符相同)。

取三种情况的最小值,就是f[i][j]

时间复杂度:
状态数量:n^2;
状态计算:3
o(n^2)

AC代码:

#include <iostream>
#include <algorithm>

using namespace std;

const int N=1010;

char a[N],b[N];//字符串
int n,m;
int f[N][N];//状态转移方程

int main()
{
    cin>>n>>a+1;//字符串从下标1开始 省去一些边界问题的判断
    cin>>m>>b+1;
    
    for(int i=0;i<=m;i++) f[0][i]=i;//初始化
    for(int i=0;i<=n;i++) f[i][0]=i;
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1);//状态转移
            if(a[i]==b[j]) f[i][j]=min(f[i][j],f[i-1][j-1]);
            else f[i][j]=min(f[i][j],f[i-1][j-1]+1);
        }
        
    cout<<f[n][m]<<endl;//字符串a[1~i]与b[1~j]所有操作方案的最小值
    
    return 0;
}

标签:字符,第二个,字母,距离,变为,编辑,字符串,AGT
From: https://www.cnblogs.com/Eric0521/p/18038415

相关文章

  • el-table分页时实现切换分页多选选中效果并且编辑回显默认选中
    <el-tableref="table":data="tableData"borderheight="100%":row-key="getRowKeys"@selection-change="handleSelectionChange"></el-table>关键代码:1::row-key="getRowKeys&quo......
  • The Missing Semester of Your CS Education----vim编辑器
    一.编辑模式Vim的设计以大多数时间都花在阅读、浏览和进行少量编辑改动为基础,因此它具有多种操作模式:正常模式:在文件中四处移动光标进行修改插入模式:插入文本替换模式:替换文本可视化模式(一般,行,块):选中文本块命令模式:用于执行命令你可以按下(退出键)从任何其他模式返回正常模......
  • haversine公式_计算gps距离接口例程
    1haversine公式  先放着,后续补充原理;2接口函数目的  前几天测试反馈了一条骑行记录的bug,实际记录和具体坐标对不上;骑行记录的数据又多,分析不直观;  实际gps坐标数据拿出来模拟仿真没什么问题,估计采样点还是哪里有问题把,先放放;  这几天没什么事,整了一个函数接口用来......
  • 可编辑模式下安装 python 包
    可编辑模式下安装python包一般情况下,我们使用的是pipinstallpkg来完成包的安装,默认的安装的目标目录在site-packages下,这种情况非常适合我们引用某些成熟包.如果我们想要给github某个项目贡献PR,或者仅仅要魔改一下某个项目,可以使用editable模式来安装.edit......
  • Eplan插件 - 页描述批量编辑器
    前言在工作中,我们经常会遇到修改页描述属性的情况,比如从其他项目复制了页或者是新建了多页。但是在Eplan中,没有办法直接批量编辑页描述属性。通常我们有以下两种方法来批量修改属性。1.修改高层代号/位置代号中的页描述属性在这里我们可以选择顶层的文档类型代号,点击属性在......
  • PowerShell 中,你可以使用一些命令来处理映像文件,包括挂载、捕捉、卸载、格式转换和编
    PowerShell中,你可以使用一些命令来处理映像文件,包括挂载、捕捉、卸载、格式转换和编辑映像。以下是一些常用的命令:挂载映像(MountImage):powershellCopyCodeMount-WindowsImage-ImagePath"C:\Path\To\Image.wim"-Path"C:\Mount\Directory"-Index1捕捉映像(CaptureIm......
  • vi编辑器命令
    viFile打开文件o启动编辑键盘Esc按键退出编辑Esc后,输入如下命令:w保存文件但不退出vi:wnewfile将修改另外保存到file中,不退出vi:w!强制保存,不退出vi:wq保存文件并退出vi:wq!强制保存文件,并退出vi:q不保存文件,退出vi:q!不保存文件,强制退出vi:e!放弃所有修改,......
  • 代码随想录 day59 两个字符串的删除操作 编辑距离
    两个字符串的删除操作两种思路如果是以最长公共子序列去理解求出这个子序列长度然后原长减一下就行如果是直接正面求解就是如下解法递推式很好理解初始化意思是当一个串为0长度时需要操作另一个字符串长度次也就是直接赋予下标编辑距离dp[i-1][j-1]+1意......
  • Unity编辑器扩展秘籍-利用Editor.finishedDefaultHeaderGUI增加Header功能
    利用Editor.finishedDefaultHeaderGUI这个回调可以实现自定义Header菜单usingUnityEditor;usingUnityEngine;namespaceYaojz{[InitializeOnLoad]publicstaticclassDefaultHeaderDrawer{staticDefaultHeaderDrawer(){E......
  • Unity编辑器扩展秘籍-利用EditorApplication.contextualPropertyMenu为右键菜单增加自
    假设我们希望为材质右键弹出按钮增加新的功能,应该怎么做呢我们可以通过注册EditorApplication.contextualPropertyMenu全局回调方法,增加自定义的MenuItemusingUnityEditor;usingUnityEngine;namespaceYaojz{[InitializeOnLoad]publicstaticclassMaterialC......