題目:給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。
示例 1:
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbcbcac」示例 2:輸出: true
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbbaccc」首先這道題我們需要理解什麼是"交錯",我把s1和s2中的字串在s3中用不同顏色表示出來,馬上豁然開朗輸出: false
s1用紅色標註,s2用黃色標註:
示例1(當然組合不止這一種情況):
我們發現在s3中可以依序找到完整的s1以及s2的部分。
因此輸出結果是true
然而示例2並不能像這樣成功找到拼出s3的s1以及s2部分。
因此輸出結果是false
很多人的第一想法可能是利用雙指標法去解決問題。
給s1以及s2分別設定兩個指標,從頭指向尾,按序判斷它們的字母是否與s3中的字母相等,如果s3中的字母全部能依序找到s1以及s2中的歸宿,那麼輸出結果是true,否則結果是false。
乍一看,這個思路很對,然而實際實現後發現,對於示例1,給出的答案是false
我分析了一下原因,發現雙指標法對於處理這種有很多重複字母的情況表現並不好,它沒有辦法判斷目前這個同時滿足條件的字母到底屬於s1還是s2,如果判斷錯誤,就會導致之後的字母無法正確組合出想要的結果,進而給出錯誤答案。
所以我們要另闢蹊徑,利用「動態規劃」。
第一件事是判斷字母長度 ,如果|s1|+|s2|≠|s3|
那麼返回false
(字母長度都不一樣,怎麼可能得出正確結果呢)
如果長度相等,我們可以進行下一步操作。
定義:f[i][j]
表示 s1 的前 i 個字母和 s2 的前 j 個字母是否能組成 s3的前 i+j 個字母,是乙個布林型別變數。
同時f[i][j]
的值取決於f[i-1][j]
的值,如果 s1 的第 i 個字母與 s3 的第 i+j 個字母相等,可以得出等式:
f [ i ][ j ] = f [ i-1 ][ j ] and (s1 [ i-1 ]==s3 [ i+j-1 ])
同理,f[i][j]
取決於f[i][j-1]
的值,如果 s2 的第 j 個字母與 s3 的第 i+j 個字母相等,可以得出等式:
f [ i ][ j ] = f [ i ][ j-1 ] and (s2 [ j-1 ]==s3 [ i+j-1 ])
綜上,我們可以得出f[i][j]
的總關係式為:
f[i][j] = or
我們還要設定邊界條件:f [0][0] = true
現在就可以用**去實現了!
public
class
answer5
}return f[a]
[b];
}}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...