Edit Distance
该题目和求两个字符串的最长公共子串,有相似之处。关键是求得动态规划方程。即f(m,n)= MIN(f(m-1,n-1),f(m-1,n),f(m,n-1)) + 1;f(m,n)表示长度为m的字符串转换为长度为n的字符串所需的最少步骤。f(m,n)递推是通过和最后一个字符串的比较递推得到。存在一个定理,如果两个字符串的最后一个字符相同,则f(m,n) = f(m-1,n-1);
class Solution {
public:
string pattern ;
string word;
int minDistance(string word1, string word2) {
vector<vector<int>> buf(word2.size()+1);
int step = 0 ,i = 0, j = 0;
pattern = word1;
word = word2;
if(word1.size() ==0)
return word2.size();
if(word2.size() ==0)
return word1.size();
for(i=0; i<word2.size()+1; i++)
{
buf[i].resize(word1.size()+1);
}
for(i=0; i<word2.size()+1; i++)
{
buf[i][0] = i;
}
for(i=0; i<word1.size()+1; i++)
{
buf[0][i] = i;
}
for(i=1; i<=word2.size(); i++)
for(j=1; j<= word1.size(); j++)
{
step = GetMin(i,j,buf);
buf[i][j] = step;
}
return buf[i-1][j-1];
}
int GetMin(int i,int j,vector<vector<int>>& buf)
{
int step = 0;
if(i == 0)
return j;
if(j == 0)
return i;
if(word[i-1] == pattern[j-1])
return GetMin(i-1,j-1,buf);
step = min(buf[i-1][j],buf[i][j-1]);
step = min(step,buf[i-1][j-1]);
step +=1;
return step;
}
};
浙公网安备 33010602011771号