[LeetCode][Java] Interleaving String

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.