給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。
示例 1:
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbcbcac」
輸出: true
示例 2:
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbbaccc」
輸出: false
這個題可以用動態規劃解決,思路與lcs(longest common subsequence,最長公共子串行)類似。用 dp[
i][j
]dp[i][j]
dp[i][
j]來記錄 s1[
:i],
s2[:
j]
s1[:i], s2[:j]
s1[:i]
,s2[
:j]是否可以交錯著組成 s3[
:i+j
]s3[:i+j]
s3[:i+
j]。注意,此處的index是 「up to but not included」,例如 s[:
i]
s[:i]
s[:i
]就是從開頭選取該 string s長度為 i。
下一步就是寫出狀態轉移方程,設想,如果我們要考察 s1[
:i],
s2[:
j]
s1[:i], s2[:j]
s1[:i]
,s2[
:j]是否可以交錯著組成 s3[
:i+j
]s3[:i+j]
s3[:i+
j],只需要檢視:
是否 s1[
i−1]
==s3
[i+j
−1
]s1[i-1]==s3[i+j-1]
s1[i−1
]==s
3[i+
j−1]
如果確實為真,則問題可以被 reduce到考察 s1[
:i−1
],s2
[:j]
s1[:i-1], s2[:j]
s1[:i−
1],s
2[:j
]是否可以交錯著組成 s3[
:i+j
−1
]s3[:i+j-1]
s3[:i+
j−1]
,其實就是 dp[
i−1]
[j
]dp[i-1][j]
dp[i−1
][j]
的值,這就完成了問題的轉換。
類似的,我們還可以考察是否 s2[
j−1]
==s3
[i+j
−1
]s2[j-1]==s3[i+j-1]
s2[j−1
]==s
3[i+
j−1]
如果確實為真,則問題可以被 reduce到考察 s1[
:i],
s2[:
j−1]
s1[:i], s2[:j-1]
s1[:i]
,s2[
:j−1
]是否可以交錯著組成 s3[
:i+j
−1
]s3[:i+j-1]
s3[:i+
j−1]
,其實就是 dp[
i][j
−1
]dp[i][j-1]
dp[i][
j−1]
的值。
綜上,
dp[i]
[j]=
(dp[i-1]
[j]*
(s1[i-1]
==s3[i+j-1]
))||(dp[i]
[j-1]*
(s2[j-1]
==s3[i+j-1]
));
總的來說,可以寫出如下**:
class
solution
for(
int j=
1; j<=n; j++
)for
(int i=
1; i<=m; i++)}
return dp[m]
[n];
};
時間擊敗 90%,空間擊敗100%
如果我們再想一想狀態轉移方程,我們會發現,它其實只依賴於上方和左方的值,這提示我們其實可以使用乙個 1d dp array就可以實現了。
具體**如下:
class
solution
for(
int i=
1; i<=m; i++)}
return dp[n];}
};
動態規劃嘛,就是如果想出了dp和狀態轉移就簡單得跟什麼似的,想不出就抓破腦袋… ALGO Leetcode 97 交錯字串
原題鏈結 給定三個字串 s1 s2 s3,請你幫忙驗證 s3 是否是由 s1 和 s2 交錯 組成的。兩個字串 s 和 t 交錯 的定義與過程如下,其中每個字串都會被分割成若干 非空 子字串 s s1 s2 sn t t1 t2 tm n m 1 交錯 是 s1 t1 s2 t2 s3 t3 或者 ...
LeetCode(97) 交錯字串
hard!題目描述 給定三個字串 s1,s2,s3,驗證 s3 是否是由 s1 和 s2 交錯組成的。示例 1 輸入 s1 aabcc s2 dbbca s3 aadbbcbcac 輸出 true 示例 2 輸入 s1 aabcc s2 dbbca s3 aadbbbaccc 輸出 false 解題...
計蒜客 交錯字串
題目描述 aabd abdc aabdabdc aabc abad aabcbaad 方法分析 動態規劃。思路 構造乙個大小為 s1len 1 s2len 1 的矩陣 dp i j 的含義 s1的前i個字元能否和s2的前j個字元構成s3的前i j個字元 1.初始化dp 0 0 1 表示s3為空時,s...