题目:isInterleave
要求:
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例:
样例
比如 s1 = "aabcc" s2 = "dbbca"
- 当 s3 = "aadbbcbcac",返回 true.
- 当 s3 = "aadbbbaccc", 返回 false.
算法要求:
要求时间复杂度为O(n^2)或者更好
解题思路:
使用深度搜索即可。
递归调用,如果这个当前字母与s3的字母相同则进入递归。
用a数组来进行记忆化搜索,不用写三维的,写二维即可。
用flag来记录是否找到。
算法如下:
bool isInterleave(string s1, string s2, string s3) {
this->s1 = s1;
this->s2 = s2;
this->s3 = s3;
memset(a, false, sizeof(a));
dist(0, 0, 0);
return flag;
}
string s1;
string s2;
string s3;
bool a[1001][1001];
bool flag = false;
void dist(int i, int j, int k) {
if (flag || a[i][j]) {
return;
}
a[i][j] = true;
if (s3[k] == '\0') {
flag = true;
return;
}
if (s3[k] == s1[i]) {
dist(i + 1, j, k + 1);
}
if (s3[k] == s2[j]){
dist(i, j + 1, k + 1);
}
}