#include <iostream> using namespace std; int ptr[1010][1010]; int main() { string s1,s2,s ="";cin>>s1>>s2; int len1 = s1.size(); int len2 = s2.size(); int res = 0; for(int i = 0;i<=len1;i++){ ptr[i][0] = i; } for(int i = 0;i<=len2;i++){ ptr[0][i] = i; } for(int i = 1;i<=len1;i++){ for(int j = 1;j<=len2;j++){ int d; int tem = min(ptr[i-1][j]+1,ptr[i][j-1]+1); if(s1[i-1]==s2[j-1]){ d= 0; } else{ d = 1; } ptr[i][j] = min(tem,ptr[i-1][j-1]+d); } } cout<<ptr[len1][len2]<<'\n'; return 0; } // 64 位输出请用 printf("%lld")
可以使用动态规划的方法去测量DP的值,步骤大致如下:
初始化一个DP矩阵(M,N),M和N分别是两个输入字符串的长度。
矩阵可以从左上角到右下角进行填充,每个水平或垂直跳转分别对应于一个插入或一个删除。
通过定义每个操作的成本为1,如果两个字符串不匹配,则对角跳转的代价为1,否则为0,简单来说就是:
如果[i][j]位置的两个字符串相等,则从[i][j]位置左加1,上加1,左上加0,然后从这三个数中取出最小的值填充到[i][j]。
如果[i][j]位置的两个字符串不相等,则从[i][j]位置左、左上、上三个位置的值中取最小值,这个最小值加1(或者说这三个值都加1然后取最小值),然后填充到[i][j]。
按照上面规则LD矩阵(M,N)填充完毕后,最终矩阵右下角的数字就是两个字符串的LD值。