c) Replace a character
这一问题类似于求两个字符串的相似度。
思路:首先注意允许什么样的编辑操作,所消耗的距离是多少。然后进行动态规划。
状态量dis[i][j]表示字符串s1的前i个字符与字符串s2的前j个字符的编辑距离。
如果s1的第i个字符和s2的第j个字符相等(即s1[i-1]==s2[j-1]),那么dis[i][j] = dis[i-1][j-1];
如果不相等,那么需要看dis[i-1][j],dis[i][j-1],dis[i-1][j-1]。
从dis[i-1][j],给s1添加一个字符即可;
从dis[i][j-1],给s2添加一个字符即可;
从dis[i-1][j-1],把俩字符的其中一个字符替换一下即可。
三选一,选最小的。
代码:
class Solution { public: int min(int a, int b, int c) { if(a > b) { if(b > c) return c; else return b; } else { if(a > c) return c; else return a; } } int minDistance(string word1, string word2) { int n1 = word1.size(); int n2 = word2.size(); if(n1 == 0) return n2; else if(n2 == 0) return n1; int mindis; int **dis = new int *[n1+1]; for(int i=0;i<n1+1;i++) dis[i] = new int[n2+1]; for(int i=0;i<n1+1;i++) dis[i][0] = i; for(int i=0;i<n2+1;i++) dis[0][i] = i; for(int i=1;i<n1+1;i++) for(int j=1;j<n2+1;j++) { if(word1[i-1] == word2[j-1]) dis[i][j] = dis[i-1][j-1]; else dis[i][j] = min(dis[i-1][j] + 1 , dis[i][j-1] + 1, dis[i-1][j-1] + 1); } mindis = dis[n1][n2]; for(int i=0;i<n1+1;i++) delete[] dis[i]; delete dis; return mindis; } };可参考:http://www.geeksforgeeks.org/dynamic-programming-set-5-edit-distance/