描述
对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:
修改一个字符(如把“a”替换为“b”);
删除一个字符(如把“traveling”变为“travelng”)。
比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。
给定任意两个字符串,写出一个算法来计算出他们的距离。
输入
第一行有一个整数n。表示测试数据的组数。
接下来共n行,每行两个字符串,用空格隔开,表示要计算距离的两个字符串。
字符串长度不超过1000。
输出
针对每一组测试数据输出一个整数,值为两个字符串的距离。
样例输入
3
abcdefg abcdef
ab ab
mnklj jlknm
样例输出
1
0
4
1 #include<bits/stdc++.h> 2 using namespace std; 3 int dp[1001][1001]; 4 //dp[i][j]是前i个字符和前j个字符的最小距离 5 //dp[i-1][j-1]+1 是ai和bj不等时使用修改字符的操作 6 //dp[i][j-1]+1 删掉bj 7 //dp[i-1][j]+1 删掉ai 8 string a,b; 9 int n,m; 10 int main() 11 { 12 int t; 13 cin>>t; 14 while(t--) 15 { 16 memset(dp,0,sizeof(dp)); 17 cin>>a>>b; 18 n = a.length(); 19 m = b.length(); 20 a = '#'+a; 21 b = '#'+b; 22 for(int i=0;i<=n;i++)//当a字符串长度为i,b长度为0时距离为i 23 dp[i][0] = i; 24 for(int i=0;i<=m;i++)//当b字符串长度为i,a长度为0时距离为i 25 dp[0][i] = i; 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=m;j++) 28 { 29 if(a[i]==b[j])dp[i][j] = dp[i-1][j-1]; //如果ai和bj相同,那么不用+1 30 else dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1; //取最近的距离+1 31 } 32 cout<<dp[n][m]<<endl; 33 } 34 return 0; 35 }
标签:字符,两个,int,距离,字符串,7659,动态,dp From: https://www.cnblogs.com/jyssh/p/17310974.html