7659: 计算字符串距离 动态规划

描述

 

对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:    

修改一个字符(如把“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 }

 

posted @ 2023-04-12 19:29  CRt0729  阅读(51)  评论(0)    收藏  举报