原题为删除两个字符串的不同部分使两个字符串相同,求删除的步数。
反向推理即为求两个字符串中的最长的公共部分,这个公共部分可不连续,然后利用动态规划求解这个问题。
实际官网讲解:
https://leetcode.com/problems/delete-operation-for-two-strings/#/solution
当i ==0 || j ==0: dp(i,j)=0;
当word1[i]!=word2[j]: dp(i,j)=max(dp(i-1,j),dp(i,j-1))
当word2[i]=word2[j]: dp(i,j)=dp(i-1,j-1)+1;
最后结果:word1.size()+word2.size()-dp(word1.size(),word2.size())*2;
class Solution {
public:
int minDistance(string w1, string w2) {
int n1=w1.size(),n2=w2.size();
int dp[n1+1][n2+1];
//i,j 分别代表w1和w2的第i,j位的字符。i=0,j=0代表公共字符串为空
for(int i=0;i<=n1;++i)
{
for(int j=0;j<=n2;++j)
{
//当i ==0 || j ==0: dp(i,j)=0;
if(i==0||j==0)
dp[i][j]=0;
else
{
//当word2[i]=word2[j]: dp(i,j)=dp(i-1,j-1)+1;
if(w1[i-1]==w2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
//当word1[i]!=word2[j]: dp(i,j)=max(dp(i-1,j),dp(i,j-1))
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
return n1+n2-dp[n1][n2]*2;
}
};