97. 交错字符串
题目:



题解:
java
class Solution {
int[][] dp;
public boolean isInterleave(String s1, String s2, String s3) {
int m = s1.length();
int n = s2.length();
//如果二者长度不同,那必然是不能被表示的
if(n+m!=s3.length()) {
return false;
}
//用dp数组表示是否能被a/b表示
dp = new int[m+1][n+1];
for(int[] row:dp) {
Arrays.fill(row, -1); //-1表示没有计算过
}
char[] a = s1.toCharArray();
char[] b = s2.toCharArray();
char[] c = s3.toCharArray();
return dfs(m-1, n-1, a, b, c);
}
boolean dfs(int l, int r, char[] a, char[] b, char[] c) {
if(l<0 && r<0) {
return true;
}
//这是是剪枝,把重复的砍掉
if(dp[l+1][r+1]!=-1) { //之前计算过
return dp[l+1][r+1]==1;
}
boolean res = l >= 0 && a[l]==c[l+r+1] && dfs(l-1,r,a,b,c) ||
r >=0 && b[r]==c[l+r+1] && dfs(l,r-1,a,b,c);
dp[l+1][r+1]=res?1:0;
return res;
}
}
java
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int m = s1.length();
int n = s2.length();
//如果二者长度不同,那必然是不能被表示的
if(n+m!=s3.length()) {
return false;
}
char[] a = s1.toCharArray();
char[] b = s2.toCharArray();
char[] c = s3.toCharArray();
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0]=true;
for(int i=0;i<n;i++) {
dp[0][i+1]=b[i]==c[i]&&dp[0][i];
}
for(int i=0;i<m;i++) {
dp[i+1][0]=a[i]==c[i]&&dp[i][0];
for(int j=0;j<n;j++) {
dp[i+1][j+1]=a[i]==c[i+j+1]&&dp[i][j+1] ||
b[j]==c[i+j+1]&&dp[i+1][j];
}
}
return dp[m][n];
}
}