标签:stream 经典的 for ons length space 转换 数组 保存
1.实践题目
7-3 编辑距离问题
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。
2.问题描述
给定a串、b串,对a串进行三种字符操作转换成b串,计算最少操作数。
3.算法描述
动态规划,从上到下从左往右填lena*lenb的表格,两层for循环匹配,字母相同填左上,失配时要对字符进行操作,操作数?1,即左上的值?1,与左边和上边的值+1比较大小,取min更新,最后递推到右下角dp[lena][lenb]为所求答案
代码:
#include<iostream>
using namespace std;
const int maxn=2e3+10;
int dp[maxn][maxn];
int main()
{
string a,b;
cin>>a>>b;
int lena=a.length(),lenb=b.length();
for(int i=0;i<=lena;i++)
dp[i][0]=i;
for(int i=0;i<=lenb;i++)
dp[0][i]=i;
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++){
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1];
}
else{
dp[i][j]=dp[i-1][j-1]+1;
}
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1])+1,dp[i][j]);
}
cout<<dp[lena][lenb]<<endl;
}
4.算法时间及空间复杂度分析
dp过程的时间复杂度是O(lena*lenb)即O(n^2)
用二维数组保存子问题的解,空间复杂度是O(n^2)
5.心得体会
通过经典的题目加深了对动态规划算法的理解,上机的时候很懵逼第一题就敲了很久,还好队友小姐姐思维很清晰,超耐心的和我讲了她的思路然后顺利敲出来!感受到了dp的巧妙和实用,要继续锻炼思维和学习算法。
标签:stream 经典的 for ons length space 转换 数组 保存
原文地址:https://www.cnblogs.com/biekanle/p/11698359.html