簡單dp
res[i][j]表示i長度的前a個字元的串與前j個長度的b字串的編輯距離
當stra[i-1]等於strb[j-1]時,狀態轉移為res[i][j]=res[i-1][j-1]
否則,res[i][j]=MIN(res[i-1][j-1]+1,res[i][j-1]+1,res[i-1][j]+1)
#include<iostream>#include<algorithm>#include<cstdio>using namespace std;char stra[1010];char strb[1010];int res[1010][1010];//res[i][j]表示i長度的前a個字元的串與前j個長度的b字串的編輯距離//最後結果為res[la][lb]int main(){int la,lb;while (~scanf("%d %d",&la,&lb)){scanf("%s",stra);scanf("%s",strb);//求res[i][j]//res[i-1][j]+1 res[i][j-1]+1 res[i-1][j-1]for (int i= 0; i <=lb; i++){res[0][i]=i;}for (int i = 0; i <=la; i++){res[i][0]=i;}for(int i=1;i<=la;i++){for(int j=1;j<=lb;j++){res[i][j]=INT_MAX;}}for(int i=1;i<=la;i++){for (int j = 1; j <=lb; j++){if(stra[i-1]==strb[j-1]){res[i][j]=res[i-1][j-1];}if(res[i-1][j]>res[i][j-1]){if (res[i][j]>res[i][j-1]+1){res[i][j]=res[i][j-1]+1;}}else{if (res[i][j]>res[i-1][j]+1){res[i][j]=res[i-1][j]+1;}}if(res[i][j]>res[i-1][j-1]+1){res[i][j]=res[i-1][j-1]+1;}}}printf("%d\n",res[la][lb]);}return 0;}