首页 > 代码库 > LeetCode Edit Distance
LeetCode Edit Distance
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
解题思路:
典型的动态规划问题,于是先搞一个状态表d[][],至于下标可以因题而异。
分析状态:如果word1为空,要想到达word2,只有插入len2次,也就是状态表中的d[0][len2],同理若word2为空,则删除len1次,即d[len1][0],对于状态d[i][j]来说,表示的意思是:在word1仅包括原word1前i个字符的前提下,转换到word2(仅包含原word2前j个字符)所用的步数,于是我们可以得出下面的转移公式:
1.如果在状态d[i-1][j-1]的基础上,读入的word1[i] == word2[j],那么d[i][j] == d[i-1][j-1],如果不相等,状态d[i][j]可以由d[i-1][j-1]通过替换第i个字符转化得
2.另一种情况是d[i-1][j] -> d[i][j],这种情况的意义是:由word1的前i-1个字符转换到word2的前j个字符步骤已知,那么要得到状态d[i][j],只需要在当状态d[i][j]时删除word1的第i个元素,就回到了状态d[i-1][j],而d[i-1][j]是已知的。
3.另一种情况是d[i][j-1] ->d[i][j],这种情况的意义是:由word2的前i个字符转换到word2的前j-1个字符步骤已知,那么要得到状态d[i][j],只需要在状态d[i][j-1]时插入一个字符就可以得到状态d[i][j]。
综上:状态d[i][j] 分3种情况:d[i-1][j-1] + cost(替换或者保持原样) 或 d[i-1][j] + 1(加1代表删除最后那个元素) 或 d[i][j-1] + 1(加1代表转移到状态d[i][j-1]后插入一个元素)
class Solution {public: int minDistance(string word1, string word2) { int len1 = word1.size(), len2 = word2.size(); int d[len1 + 1][len2 + 1]; if(len1 == 0)return len2; if(len2 == 0)return len1; for(int i=0;i<=len1;++i)d[i][0]=i; for(int j=0;j<=len2;++j)d[0][j]=j; char st1,st2; for(int i=1;i<=len1;++i) { st1 = word1[i-1]; for(int j=1;j<=len2;++j) { st2 = word2[j-1]; int cost = 0; if(st1 == st2) cost = 0; else cost = 1; d[i][j] = min(min(d[i-1][j]+1, d[i][j-1]+1),d[i-1][j-1]+cost); } } return d[len1][len2]; }};
LeetCode Edit Distance