Leetcode-字串問題--最長的公共子字串長度--可不連續--#583
阿新 • • 發佈:2019-01-03
原題為刪除兩個字串的不同部分使兩個字串相同,求刪除的步數。
反向推理即為求兩個字串中的最長的公共部分,這個公共部分可不連續,然後利用動態規劃求解這個問題。
實際官網講解:
當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; } };