交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + sn
t = t1 + t2 + ... + tm
|n - m| <= 1
交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...
注意:a + b 意味着字符串 a 和 b 连接。
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出:true
示例 2:
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出:false
示例 3:
输入:s1 = “”, s2 = “”, s3 = “”
输出:true
代码解题如下:
bool isInterleave(char * s1, char * s2, char * s3){
int i=0,j=0,k=0;
int s1_l=strlen(s1);
int s2_l=strlen(s2);
int s3_l=strlen(s3);
// if(s1[4]=='b'&&s2[4]=='a'&&s1[3]=='b'&&s1[2]=='b') return true;
// }
if(s1_l+s2_l>s3_l) return false;
if(s1_l+s2_l<s3_l) return false;
while(s1[i]!='\0'&&s2[j]!='\0'&&s3[k]!='\0'){
if(s2[j]==s3[k]&&s1[i]==s3[k]){
return isInterleave(s1+i+1,s2+j,s3+k+1)||isInterleave(s1+i,s2+j+1,s3+k+1);
}
else if(s1[i]==s3[k]&&s2[j]!=s3[k]){
i++;
k++;
}
else if(s2[j]==s3[k]&&s1[i]!=s3[k]){
j++;
k++;
}
else if(s2[j]!=s3[k]&&s1[i]!=s3[k]){return false;}
}
if(s1[i]!='\0'&&s3[k]!='\0'){
while(s1[i]==s3[k]&&s1[i]!='\0'&&s3[k]!='\0'){
i++;
k++;
}
}
if(s2[j]!='\0'&&s3[k]!='\0'){
while(s2[j]==s3[k]&&s2[j]!='\0'&&s3[k]!='\0'){
j++;
k++;
}
}
// printf("%d %d ",i,k);
// printf("--1 %c 2 %c 3 %c ",s1[i],s2[j],s3[k]);
if(s3[k]=='\0'&&s1[i]=='\0'&&s2[j]=='\0') return true;
else return false;
}