97. 交错字符串
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true
示例 2:
输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false
官方滑动数组
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int n1 = s1.length(),n2 = s2.length(),n3 = s3.length();
if(n1+n2 != n3){
return false;
}
boolean[] dp = new boolean[n2+1];
dp[0]=true;
for(int i=0;i<=n1;i++){
for(int j=0;j<=n2;j++){
int p = i+j-1;
if(i>0){
dp[j] = dp[j]&&s1.charAt(i-1)==s3.charAt(p);
}
if(j>0){
dp[j] = dp[j]||(dp[j-1]&&s2.charAt(j-1) == s3.charAt(p));
}
}
}
return dp[n2];
}
}
自己写的垃圾dp
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int n1 = s1.length(),n2 = s2.length(),n3 = s3.length();
if(n1+n2 != n3){
return false;
}
boolean[][] dp = new boolean[n2+1][n1+1];
dp[0][0] = true;
for(int i=1;i<=n2;i++){
if(s2.charAt(i-1)==s3.charAt(i-1)){
dp[i][0]=true;
}else{
break;
}
}
for(int j=1;j<=n1;j++){
if(s1.charAt(j-1)==s3.charAt(j-1)){
dp[0][j]=true;
}else{
break;
}
}
for(int i=1;i<=n2;i++){
for(int j=1;j<=n1;j++){
if(dp[i-1][j]&&s2.charAt(i-1)==s3.charAt(i+j-1)||dp[i][j-1]&&s1.charAt(j-1)==s3.charAt(i+j-1)){
dp[i][j]=true;
}
}
}
// 显示动态规划数组
for(int i=0;i<=n2;i++){
for(int j=0;j<=n1;j++){
System.out.print(dp[i][j] + " ");
}
System.out.println();
}
return dp[n2][n1];
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/interleaving-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。