原題爲刪除兩個字符串的不同部分使兩個字符串相同,求刪除的步數。
反向推理即爲求兩個字符串中的最長的公共部分,這個公共部分可不連續,然後利用動態規劃求解這個問題。
實際官網講解:
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;
}
};