LC97 交錯字串

2021-10-08 05:59:05 字數 2437 閱讀 8081

給定三個字串 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...