Problem: 97. 交错字符串
思路
设dp[s1len][s2len] = true
为s1的前s1len
个字符和s2的前s2len
个字符一共可以匹配s3的前s1len+s2len
个字符
- 当前s1能够匹配的最后一个字符的索引为
s1len-1
- 当前s2能够匹配的最后一个字符的索引为
s2len-1
- 当前s3能够匹配的最后一个字符的索引为
s1len+s2len-1
且该字符等于上面两个中的其中一个字符,设该字符为chr
一般地,该状态可以由两种情况派生:
- 当
dp[s1len-1][s2len] = true
时,若s1[s1len-1]==chr
,则当前状态为true
- 当
dp[s1len][s2len-1] = true
时,若s2[s2len-1]==chr
,则当前状态为true
考虑两种特殊情况:
- 当
s1+s2
或者s2+s1
可以直接串联构成s3时,可以直接返回true
- 当
s1.length+s2.length!=s3.length
时,可以直接返回false
复杂度
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution fun Solution.isInterleave(s1: String, s2: String, s3: String): Boolean { if (s1 + s2 == s3 || s2 + s1 == s3) return true if (s1.length + s2.length != s3.length) return false val dp = Array(s1.length + 1) { s1ptr -> BooleanArray(s2.length + 1) { s2ptr -> s1ptr == 0 && s2ptr == 0 } } for ((index, chr) in s3.withIndex()) { val len = index + 1 for (s1len in 0..Math.min(len, s1.length)) { val s2len = len - s1len if (s1len <= s1.length && s2len <= s2.length) { if ((s1len > 0 && dp[s1len - 1][s2len] && s1[s1len - 1] == chr) || (s2len > 0 && dp[s1len][s2len - 1] && s2[s2len - 1] == chr) ) { dp[s1len][s2len] = true if (len == s3.length) return true } } } } return false }
|