题目描述
小蓝拥有两个字符串 S,T。他希望通过如下操作使得字符 S 转换为字符串 T。
操作有一下三种:
删除一个字符。
插入一个字符。
将一个字符改为另一个字符。
问最少需要操作多少次才可以使得字符串 S 转换为字符串 T。
输入描述
输出描述
输出一个整数表示答案。
输入输出样例
示例 1
输入
abc
aa
输出
2
1.删除:dp(i-1,j)+1
把字符串A的第i个字符删除,操作次数加一
2.添加:dp(i,j-1)+1
在字符串A末添加字符串B的第j个字符,操作次数加一
3.替换:dp(i-1,j-1)+1
将字符串A的第i个字符替换成字符串B的第j个字符,操作次数加一
4.不变:dp(i-1,j-1)
如果字符串A的第i个字符等于字符串B的第j个字符,什么都不做
第三步处理边界情况
就把dp[i][0]和dp[0][i]赋值为i就可以了
因为空字符串变成i个字符的话,i次操作便可以了
#include <bits/stdc++.h>
using namespace std;
int dp[2000][2000];
int n,m;
char a[2000];
char b[2000];
int main()
{
scanf("%s %s",a+1,b+1);
n=strlen(a+1);
m=strlen(b+1);
dp[0][0]=0;
for(int i=1;i<=n;i++)
dp[i][0]=i;
for(int j=1;j<=m;j++)
{
dp[0][j]=j;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][j-1];
}
else
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;//min里面只能比较两个数,所以需要用到两个min
}
}
cout<<dp[n][m];
return 0;
}