LeetCode-97.交錯字符串

  給定三個字符串 s1s2s3, 驗證 s3 是不是由 s1 和 s2 交錯組成的。數組

  示例 1:動畫

  輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
  輸出: true

  示例 2:spa

  輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
  輸出: false

  

  注意題目,s3是由s1和s2交錯組成,對比示例1和示例2能夠知道,s1個字符的相對位置不能改變,s2也是。code

  此題用動態規劃解,動態規劃題手動畫出個二維數組會比較容易理解。blog

  

 1 class Solution {  2     public boolean isInterleave(String s1, String s2, String s3) {  3         int len1=s1.length();  4         int len2=s2.length();  5         int len3=s3.length();  6         //若s3長度不等於s1加上s2的長度,就直接返回false
 7         if(len1+len2!=len3)  8             return false;  9         //在此處判斷是否有一方爲空
10         if(s1.equals(""))   return s2.equals(s3); 11         if(s2.equals(""))   return s1.equals(s3); 12         //創建dp數組,dp[i][j]表明s1的前i個數和s2的前j個數合併起來可否構成s3的前i+j個數
13         boolean [][]dp=new boolean[len1+1][len2+1]; 14         //初始化dp數組
15         dp[0][0]=true; 16         for(int i=1;i<=len1;i++) 17             dp[i][0]=s3.charAt(i-1)==s1.charAt(i-1)&&dp[i-1][0]; 18         for(int j=1;j<=len2;j++) 19             dp[0][j]=s3.charAt(j-1)==s2.charAt(j-1)&&dp[0][j-1]; 20         
21         for(int i=1;i<=len1;i++) 22             for(int j=1;j<=len2;j++){ 23                 //構造二維數組後可得,dp[i][j]可由dp[i-1][j]添加s1的第i個數 24                 //或由dp[i][j-1]添加s2的第j個數獲得,此時兩種狀況,其中一個爲true便可 25                 //由此獲得遞推式
26                 dp[i][j]=(dp[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1)) 27                     ||(dp[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1)); 28  } 29         return dp[len1][len2]; 30  } 31 }
相關文章
相關標籤/搜索