算法设计课后题;编辑距离问题;注意DP的设计;

#include <iostream> #include <string> using namespace std; #define LEN 1000 int l1,l2; string str1,str2; int dist[LEN][LEN]; int edit() { for(int i=0;i<=l1;++i) { dist[i][0]=i; //str1扫描到i,str2扫描结束, 那么从str1[0]...str1[i-1]这i个数是多余出来的,删除操作执行i次 } for(int j=0;j<=l2;++j) { dist[0][j]=j; //str1扫描完,str2扫描到j,那么需要把str2[0]...str2[j-1]插入到str1的头部,插入操作执行j次. } for(int i=1;i<=l1;++i) { for(int j=1;j<=l2;++j) { if(str1[i-1]==str2[j-1]) { dist[i][j]=dist[i-1][j-1]; } else { dist[i][j]=min(min(dist[i][j-1],dist[i-1][j-1]),dist[i-1][j])+1; //取三种操作的最小值. } } } return dist[l1][l2]; } int main() { cin>>str1>>str2; l1=str1.length(); l2=str2.length(); cout<<edit()<<endl; }

 

 

dist[i][j]表示从i往前数,j往前数的最少操作数,我们求dist[m][n],那么有4种情况.

 

如果str1[i]==str2[j],dist[i][j]=dist[i-1][j-1].... 这种情况的意思是, 如果两个字符相等,那么不必操作

如果str1[i]!=str2[j],dist[i][j]= min{} 以下三者:

1.dist[i][j-1],插入

2.dist[i-1][j-1],替换

3.dist[i-1][j],删除

 

最终的一个子问题是什么?

 

dist[0][j]=j, 意思是str1的0之前与str2的j之前匹配的最少操作数只要给str1加上str2的j之前的字符就ok.

,dist[i][0],  意思是str1的i之前与str2的0之前的匹配的最少操作数只要删除i之前的字符就和str2 的0之前匹配了.

 

你可能感兴趣的:(算法,String,include)