给定三个字符串 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
连接。
思路一:动态规划
bool isInterleave(char *s1, char *s2, char *s3)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int len3 = strlen(s3);
int **f = (int**)malloc(sizeof(int*) * (len1 + 1));
for (int i = 0; i < len1 + 1; i++) {
f[i] = (int*)malloc(sizeof(int) * (len2 + 1));
memset(f[i], 0, sizeof(int) * (len2 + 1));
}
if (len1 + len2 != len3) {
return false;
}
f[0][0] = true;
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; j++) {
int p = i + j - 1;
if (i > 0) {
f[i][j] |= (f[i - 1][j] && s1[i - 1] == s3[p]);
}
if (j > 0) {
f[i][j] |= (f[i][j - 1] && s2[j - 1] == s3[p]);
}
}
}
int ans = f[len1][len2];
for (int i = 0; i < len1 + 1; i++) {
free(f[i]);
f[i] = NULL;
}
free(f);
f = NULL;
return ans;
}
分析:
本题可使用动态规划方法解答,理解状态方程f[i][j] |= (f[i - 1][j] && s1[i - 1] == s3[p]);,即不断向后查找相同字符串,并使用f数组记录,最后返回ans即可
总结:
本题考察动态规划的应用,对于字符串内字符判断是否有两个字符串中字符,最后返回ans