97. 交错字符串
难度:困难
2020/7/18每日一题打卡√
现在开始觉得字符串动态规划都是一个套路,但是要定义好状态。我这道题没想出来状态,但是看了答案之后很快就写出来后面的了
题目描述
解题思路
首先定义状态,dp[i][j]表示s1的第i位能不能和s2的第j位组合成s3的第i+j位
这个图,感觉和那种从上到下动态规划找路径的好像啊
初始化[0,0]位置肯定是true,然后初始化第一行和第一列
对于后面的位置,他要么是从上面转化来,要么是从左边转化来
如果是从上面来,dp[i][j] = dp[i-1][j] && (s1.charAt(i-1) == s3.charAt(i-1+j));
这句意思是,首先要上面那个位置是true,然后比较s1对应位置的字母跟s2对应位置上的是否相等。
也可以是从左边转化而来,从左边的话是:
dp[i][j] = dp[i][j-1] && (s2.charAt(j-1) == s3.charAt(i+j-1));
如果左边是true,而且s2对应位置的字母和s3对应的相等,就可以
最后这两个位置结果取或,因为不管从哪边来都行
/*
* 97. 交错字符串
* 难度:困难 动态规划
* dp[i][j]表示s1的第i位能不能和s2的第j位组合成s3的第i+j位
*/
public boolean isInterleave(String s1, String s2, String s3) {
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if(len1+len2 != len3) {
return false;
}
boolean[][] dp = new boolean[len1+1][len2+1];
dp[0][0] = true;
//初始化第一列,只有s1的情况
for (int i = 1; i <= len1; i++) {
dp[i][0] = dp[i-1][0] && (s1.charAt(i-1)==s3.charAt(i-1));
}
//初始化第一行,只有s2的情况
for (int i = 1; i <= len2; i++) {
dp[0][i] = dp[0][i-1] && (s2.charAt(i-1)==s3.charAt(i-1));
}
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
dp[i][j] = dp[i-1][j] && (s1.charAt(i-1) == s3.charAt(i-1+j));
dp[i][j] = dp[i][j] || dp[i][j-1] && (s2.charAt(j-1) == s3.charAt(i+j-1));
}
}
return dp[len1][len2];
}