標籤:leetcode java interleaving string
題目:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
題意:
給定s1, s2, s3, 判定 s3是否由s1 和 s2交錯構成。
比如,
給定
s1 = "aabcc",
s2 = "dbbca",
當 s3 = "aadbbcbcac"時,返回 true.
當 s3 = "aadbbbaccc"時,返回 false.
演算法分析:
參考部落格:http://pisxw.com/algorithm/Interleaving-String.html
http://blog.csdn.net/u011095253/article/details/9248073
這是一道關於字串操作的題目,要求是判斷一個字串能不能由兩個字串按照他們自己的順序,每次挑取兩個串中的一個字元來構造出來。
像這種判斷能否按照某種規則來完成某個量的題目,很容易會想到用動態規劃來實現。
先說說維護量,res[i][j]表示用s1的前i個字元和s2的前j個字元能不能按照規則表示出s3的前i+j個字元,如此最後結果就是res[s1.length()][s2.length()],判斷是否為真即可。接下來就是遞推式了,假設知道res[i][j]之前的所有曆史資訊,我們怎麼得到res[i][j]。可以看出,其實只有兩種方式來遞推,一種是選取s1的字元作為s3新加進來的字元,另一種是選s2的字元作為新進字元。而要看看能不能選取,就是判斷s1(s2)的第i(j)個字元是否與s3的i+j個字元相等。如果可以選取並且對應的res[i-1]j也為真,就說明s3的i+j個字元可以被表示。這兩種情況只要有一種成立,就說明res[i][j]為真,是一個或的關係。所以遞推式可以表示成
res[i][j] = res[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1) || res[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1)
時間上因為是一個二維動態規劃,所以複雜度是O(m*n),m和n分別是s1和s2的長度
AC代碼:
<span style="font-family:Microsoft YaHei;font-size:12px;">public class Solution { public boolean isInterleave(String s1, String s2, String s3) { // Note: The Solution object is instantiated only once and is reused by each test case. if (s1 == null || s2 == null || s3 == null) return false; if (s1.length() + s2.length() != s3.length()) return false; boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1]; dp[0][0] = true; for(int i = 1; i < s1.length() + 1; i++) { if (s1.charAt(i - 1) == s3.charAt(i - 1) && dp[i - 1][0]) dp[i][0] = true; } for(int j = 1; j < s2.length() + 1; j++) { if (s2.charAt(j - 1) == s3.charAt(j - 1) && dp[0][j - 1]) dp[0][j] = true; } for(int i = 1; i < s1.length() + 1; i++) { for(int j = 1; j < s2.length() + 1; j++) { if ((s1.charAt(i - 1) == s3.charAt(i + j - 1) && dp[i - 1][j])||(s2.charAt(j - 1) == s3.charAt(i + j - 1) && dp[i][j - 1])) dp[i][j] = true; } } return dp[s1.length()][s2.length()]; }}</span>
著作權聲明:本文為博主原創文章,轉載註明出處
[LeetCode][Java] Interleaving String