// 3_3.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string.h>
//递归 int distance(const char * str1, int start1, int end1, const char * str2, int start2, int end2) { if(start1 > end1) { if(start2 > end2) return 0; else return end2-start2+1; } if(start2 > end2) { if(start1 > end1) return 0; else return end1-start1+1; } if(str1[start1] == str2[start2]) { return distance(str1, start1+1, end1, str2, start2+1,end2); } else { int t1 = distance(str1, start1+1,end1,str2,start2+1, end2)+1; int t2 = distance(str1, start1,end1,str2,start2+1, end2)+1; int t3 = distance(str1, start1+1,end1,str2,start2, end2)+1; if(t1 < t2 && t1 < t3) return t1; else if(t2 < t1 && t2 < t3) return t2; else return t3; } }
//动态规划 int distance2(const char * str1, int len1, const char * str2, int len2) { int ** dist = new int * [len1+1]; for(int i=0;i<=len1;i++) dist[i] = new int[len2+1]; for(int i=0;i<=len1;i++) dist[i][len2]=len1-i; for(int i=0;i<=len2;i++) dist[len1][i]=len2-i; for(int i=len1-1;i>=0;i--) { for(int j=len2-1;j>=0;j--) { if(str1[i] == str2[j]) { dist[i][j]=dist[i+1][j+1]; } else { if(dist[i+1][j] < dist[i+1][j+1] && dist[i+1][j] < dist[i][j+1]) dist[i][j] = dist[i+1][j] + 1; else if(dist[i][j+1] < dist[i+1][j+1] && dist[i][j+1] < dist[i+1][j]) dist[i][j] = dist[i][j+1] + 1; else dist[i][j] = dist[i+1][j+1] + 1; } } } return dist[0][0]; } int _tmain(int argc, _TCHAR* argv[]) { char str1[] = "abcde"; char str2[] = "bcde"; printf("distance between %s and %s id %d\n", str1, str2, distance(str1, 0, strlen(str1)-1, str2, 0, strlen(str2)-1)); printf("distance between %s and %s id %d\n", str1, str2, distance2(str1, strlen(str1), str2, strlen(str2))); return 0; }