一、题目
1、原题链接
2、题目描述
二、解题报告
1、思路分析
思路参考来源y总
dp[i][j]表示将a[1~i]变为b[1~j]中所有方案的操作次数最少的一个;- 按最后一步操作可以将状态分为:
- 删除一个字符:
dp[i-1][j]+1; - 增加一个字符:
dp[i][j-1]+1; - 替换一个字符:
dp[i-1][j-1]+1或两字符串完全相同不需要操作dp[i-1][j-1]。
- 删除一个字符:
- 所以最终的状态转移方程为
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1,dp[i-1][j-1])
2、时间复杂度
时间复杂度为O(n2)
3、代码详解
#include <iostream>
#include <string>
using namespace std;
const int N = 1010;
string a, b;
int n, m;
int dp[N][N];
int main(){
cin >> n >> a >> m >> b;
//确保字符串下标从1开始,避免数组越界情况的考虑
a = '1' + a;
b = '1' + b;
//删除i个字符
for (int i = 0; i <= n; i++){
dp[i][0] = i;
}
//增加i个字符
for (int i = 0; i <= m; i++){
dp[0][i] = i;
}
for (int i = 1; i <=n ; i++){
for (int j = 1; j <= m; j++) {
dp[i][j] = min(dp[i-1][j] + 1, dp[i][j - 1] + 1);
if (a[i] == b[j]) {
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
}
else {
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);
}
}
}
cout << dp[n][m];
return 0;
}


525

被折叠的 条评论
为什么被折叠?



