输入
abcd
abc
输出:
1
代码:
#include<bits/stdc++.h>
using namespace std;
string s,t;
int dp[1011][1011];//dp[i][j] 的值代表的是str1[0...i-1]编辑为str2[0...j-1]的最小代价。
int main()
{
while(cin>>s)
{
cin>>t;
for(int i=1;i<=s.size();++i) dp[i][0]=i;
for(int i=1;i<=t.size();++i) dp[0][i]=i;
for(int i=1;i<=s.size();++i)
{
for(int j=1;j<=t.size();++j)
{
int t1=1+min(dp[i][j-1],dp[i-1][j]);
int t2;
if(s[i-1]==t[j-1])
{
t2=dp[i-1][j-1];
}
else t2=dp[i-1][j-1]+1;
dp[i][j]=min(t1,t2);
}
}
cout<<dp[s.size()][t.size()]<<endl;
}
return 0;
}
dp[i][j]有三种转移方式:
(1)dp[i-1][j]转移到dp[i][j],即从s中多取向后一个字符,此时,对s动用“删除”操作,或者对t动用“插入”操作。
(2)dp[i][j-1]转移到dp[i][j],即从t中多取向后一个字符,此时,对t动用“删除”操作,或者对s动用“插入”操作。
(3)dp[i-1][j-1]转移到dp[i][j],即从s、t中多取向后一个字符,若取出的两个字符相等,无需操作,反之,动用“替换”操作。