算法大作业 第三题
1. 问题
给定一个源串和目标串,能够对源串进行如下操作:
在任意位置上插入一个字符;
替换任意字符;
删除任意字符。
写一个程序,实现返回最小操作次数,使得对源串进行上述这些
操作后等于目标串(源串和目标串的长度都小于2000)。
2. 解析
该问题我想用动态规划解决
动态规划就是一步步来,先假设目标串只一个字符,两个…直至到真正的长度
开一个二维数组d[i][j]来记录a0-ai与b0-bj之间的编辑距离,要递推时,需要考虑对其中一个字符串的删除操作、插入操作和替换操作分别花费的开销,从中找出一个最小的开销即为所求。
有如下两种情况:
1.如果两个字符串中的第一个字符是相同的,则忽略最后这个字符,然后再同时比较第二个字符,一直比较下去,zhidao1两个字符相同,就进入第二种情况(类似于递归的解决剩余的字符)
2.如果两个字符串中的第一个字符不相同,那么就尝试上述三种操作(插入、替换、删除)使得字符相同。并且为每种可能性递归获取剩余字符串的解决方案,并从中选择最小值min
3. 设计
for (int i=0;i<len_src;++i)
{
if(source[i]==target[j])//相等
f[i+1][j+1]=f[i][j];//f矩阵中第1个字符,第2个字符......
else
{
temp = min(f[i][j]+1,f[i][j+1]+1);
f[i+1][j+1]=min(f[i+1][j]+1,temp);
//f[i][j]+1:如果前面f[i][j]是最快的,那么前面的字符不要再动了,现在把第i+1个字符替换成第j+1字符,在给定位置上插入一个字符
//f[i][j+1]+1:如果前面f[i][j+1]是最快的,那么第i+1个字符是多余的,需要继续保持f[i][j+1]的现状,应该把第i+1个字符删除掉
//f[i+1][j]+1:如果前面f[i+1][j]是最快的,那么还缺少第j+1个字符,应该插入第j+1个字符
}
}
4. 分析
在最坏的情况下:需要对字符串的每个字符执行操作,有3次操作(插入、删除、替换),所以时间复杂度将为O(3 ^ n)。
5. 源码
https://github.com/wubbalubbad/suanfa/blob/main/%E7%AE%97%E6%B3%95%E5%A4%A7%E4%BD%9C%E4%B8%9A%E7%AC%AC%E4%B8%89%E9%A2%98