一个字符串有删除,插入,修改三种操作,问最少的步骤将两个字符串变成一样。
解法1:直接递归搜索
#include<stdio.h> #include<iostream> using namespace std; int n,m; char s1[1010],s2[1001]; int dfs(int x,int y) { if(x>=n||y>=m) return 0; if(s1[x]==s2[y]) return 1+dfs(x+1,y+1); else return max(dfs(x+1,y),dfs(x,y+1)); } int main() { while(scanf("%d",&n)!=EOF) { scanf("%s%d%s",s1,&m,s2); printf("%d\n",max(n,m)-dfs(0,0)); } return 0; }
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int d[1000][1000]; int main() { int a,b,i,j,n; char s1[1000],s2[1000]; while(scanf("%d",&a)!=EOF) { scanf("%s",s1); scanf("%d",&b); scanf("%s",s2); for(i=0;i<=a;i++) { d[i][0]=i; } for(i=0;i<=b;i++) { d[0][i]=i; } for(i=1;i<=a;i++) { for(j=1;j<=b;j++) { if(s1[i-1]==s2[j-1]) d[i][j]=min(min(d[i-1][j-1],d[i-1][j]+1),d[i][j-1]+1); else d[i][j]=min(min(d[i-1][j-1]+1,d[i-1][j]+1),d[i][j-1]+1); } } printf("%d\n",d[a][b]); } }