LeetCode-Delete Operation for Two Strings

这道题同样是一道 DP 问题,需要借助求最长公共子序列的方法的问题来解决。求出最长公共自序列以后,求将非公共子序列的字符删除需要的长度,就可以得到结果了。

最长公共子序列的递推公式为:

1
2
dp[i][j]=dp[i-1][j-1]+1 if word1[i]==word2[j]
dp[i][j]=max(dp[i-1][j],dp[i][j-1]) if word1[i]!=word2[j]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int minDistance(string word1, string word2) {
if(word1.size()==0) return word2.size();
if(word2.size()==0) return word1.size();
int** dp=new int*[word1.size()];
for(int i=0;i<word1.size();i++){
dp[i]=new int[word2.size()];
}
for(int i=0;i<word1.size();i++){
for(int j=0;j<word2.size();j++){
if(i==0 && j==0) dp[i][j]=word1[i]==word2[i]?1:0;
else if(i==0) dp[i][j]=max(dp[i][j-1],word1[i]==word2[j]?1:0);
else if(j==0) dp[i][j]=max(dp[i-1][j],word1[i]==word2[j]?1:0);
else{
if(word1[i]==word2[j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
int commonLen=dp[word1.size()-1][word2.size()-1];
return word1.size()+word2.size()-2*commonLen;
}
};