题目
解题
方法一:动态规划(最长公共子序列的方法)
word1的长度+word2的长度-2*最长的公共子序列长度 就是 两个字符串的删除操作次数
也就是类似于 并集-交集 的意思
class Solution { public: int minDistance(string word1, string word2) { vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1)); for(int i=1;i<=word1.size();i++){ for(int j=1;j<=word2.size();j++){ if(word1[i-1]==word2[j-1]){ dp[i][j]=dp[i-1][j-1]+1; } else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } return word1.size()+word2.size()-2*dp[word1.size()][word2.size()]; } };
方法二:动态规划
dp[i][j]
:以i-1
为结尾的字符串word1
,和以j-1
位结尾的字符串word2
,想要达到相等,所需要删除元素的最少次数。
当word1[i - 1]
与 word2[j - 1]
相同的时候,dp[i][j] = dp[i - 1][j - 1];
当word1[i - 1]
与 word2[j - 1]
不相同的时候,有三种情况:
情况一:删word1[i - 1]
,最少操作次数为dp[i - 1][j] + 1
情况二:删word2[j - 1]
,最少操作次数为dp[i][j - 1] + 1
情况三:同时删word1[i - 1]
和word2[j - 1]
,操作的最少次数为dp[i - 1][j - 1] + 2
class Solution { public: int minDistance(string word1, string word2) { vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1)); for (int i = 0; i <= word1.size(); i++) dp[i][0] = i; for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; for (int i = 1; i <= word1.size(); i++) { for (int j = 1; j <= 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] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1}); } } } return dp[word1.size()][word2.size()]; } };
另外要使用min({a,b,c})
…要加入头文件algorithm。当然力扣中默认加入了