标签:
该题目和求两个字符串的最长公共子串,有相似之处。关键是求得动态规划方程。即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; } };
标签:
原文地址:http://www.cnblogs.com/xgcode/p/4345828.html