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 @   CRt0729  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示