LeetCode 刷题【72. 编辑距离】
72. 编辑距离
自己做
解:递归选择(超内存)
class Solution {
public:int min = 500; //最小匹配长度void muatchString(string word1, string word2, int i, int j, int stap){//匹配完wrod2if(j == (int)word2.size()){if(i <= (int)word1.size() - 1) //匹配完后如果word1还有剩余部分,那么剩余部分要删除stap += ((int)word1.size() - i);if(stap < min)min = stap;return;}//还没有匹配完else{//如果wrod1匹配完了,剩下部分通过插入处理if(i == (int)word1.size()){stap += ((int)word2.size() - j);if(stap < min)min = stap;return;}//正确匹配的情况——跳过看下个if(word1[i] == word2[j])muatchString(word1, word2, i + 1, j + 1, stap);//不正确匹配的情况——三种处理尝试else{//尝试替换muatchString(word1, word2, i + 1, j + 1, stap + 1); //尝试插入muatchString(word1, word2, i, j + 1, stap + 1); //尝试删除muatchString(word1, word2, i + 1, j, stap + 1); }}}int minDistance(string word1, string word2) {muatchString(word1, word2, 0, 0, 0);return min;}
};
看题解
官方题解如下
https://leetcode.cn/problems/edit-distance/solutions/188223/bian-ji-ju-chi-by-leetcode-solution
理解再做
不是没想到动态规划,但是开始想的时候觉得这可能不容易大问题化小问题的解决...
class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> DP(word1.size() + 1, vector<int>(word2.size() + 1));DP[0][0] = 0; //wrod1的前0位与word2的前0位匹配//边界处理:对于首行和首列for(int j = 1; j <= (int)word2.size(); j++) //word1的前0位与word2的前j位匹配【有多少位缺少就插入多少位】DP[0][j] = j;for(int i = 1; i <= (int)word1.size(); i++) //word1的前i位与word2的前0位匹配【有多少位超出就删除多少位】DP[i][0] = i;for(int i = 1; i <= (int)word1.size(); i++){for(int j = 1; j <= (int)word2.size(); j++){if(word1[i - 1] == word2[j - 1]) //相等DP[i][j] = DP[i - 1][j - 1];else //不等DP[i][j] = min(DP[i - 1][j - 1], min(DP[i - 1][j], DP[i][j - 1])) + 1; //分别对应替换、插入、删除}}return DP[(int)word1.size()][(int)word2.size()];}
};