剑指 Offer II 096. 字符串交织
题目描述:
解题思路:f[i][j]表示s3[i + j +1]可以由s1[0],s1[1]…s1[i]和 s2[0],s2[1]…s2[j]交织组成,当s3[i + j +1]=s1[i]时,f[i][j]=f[i - 1][j];当s3[i + j + 1]=s2[j]时,f[i][j]=f[i][j-1];于是状态方程组:
f[i][j]=(s1[i]==s3[i + j +1] && f[i-1][j]) || (s2[j]==s3[i + j + 1] && f[i][j - 1])
注意:这里的f[0][0]这些并不表示由s1[0]和s2[0]交织组成,指的是空字符串。下标直接从0开始,f[i-1][j]和f[i][j-1]可能会产生下标越界,所以我们从1开始,即f[0][0]表示空字符s3是否可以由空字符串s1和s2组成,显然是可以的,所以f[0][0]=true;其它的见注释。
class Solution {
final static int N = 110;
boolean[][] f = new boolean[N][N];
public boolean isInterleave(String s1, String s2, String s3) {
int n = s1.length(), m = s2.length(), t = s3.length();
if(n + m != t) {
return false;
}
for(int i = 0; i < n && s1.charAt(i) == s3.charAt(i); i++) {
f[i][0] = true;
}
for(int j = 0; j < m && s2.charAt(j) == s3.charAt(j); j++) {
f[0][j] = true;
}
f[0][0] = true;
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= m; j++) {
// i + j -1 = (i - 1) + j 或 (j - 1) + i,因为真正有效的长度是从1开始的,所以s3的下标就由s1和s2的下标相加
if(i > 0) {
if(s1.charAt(i - 1) == s3.charAt(i + j - 1) && f[i - 1][j]) {
f[i][j] = true;
}
}
if(j > 0) {
if(s2.charAt(j - 1) == s3.charAt(i + j - 1) && f[i][j - 1]) {
f[i][j] = true;
}
}
}
}
return f[n][m];
}
}