97. 交错字符串
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 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …
提示:a + b 意味著字符串 a 和 b 連接。 -
示例 1:
輸入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
輸出:true
- 示例 2:
輸入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
輸出:false
- 示例 3:
輸入:s1 = “”, s2 = “”, s3 = “”
輸出:true
提示:
- 0 <= s1.length, s2.length <= 100
- 0 <= s3.length <= 200
- s1、s2、和 s3 都由小寫英文字母組成
數組定義
dp[i][j]代表s1的前i個字符和s2的前j個字符可以組成s3的前i+j的字符
初始化
dp[0][0]=true,兩個空字符串的情況
狀態轉移
- dp[i][j]|=s3.charAt(loc)==s2.charAt(j-1)&&dp[i][j-1];
使用s2的第j個字符和s3的i+j個字符進行匹配 - dp[i][j]|=s3.charAt(loc)==s1.charAt(i-1)&&dp[i-1][j];
使用s1的第i個字符和s3的i+j個字符進行匹配
代碼
class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n=s1.length(),m=s2.length();if(n+m!=s3.length()) return false;boolean[][] dp=new boolean[n+1][m+1];dp[0][0]=true;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++){int loc=i+j-1;if(j>0)dp[i][j]|=s3.charAt(loc)==s2.charAt(j-1)&&dp[i][j-1];if(i>0)dp[i][j]|=s3.charAt(loc)==s1.charAt(i-1)&&dp[i-1][j];}return dp[n][m];} }總結
- 上一篇: 梦到僵尸是什么意思
- 下一篇: 208. 实现 Trie (前缀树)