- 困难
- 中等
- 简单
题目描述
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。来源,leetcode 每日一题 87. 扰乱字符串
解题思路
代码
class Solution {
public:
bool isScramble(string s1, string s2) {
int length = s1.length();
if (length != s2.length()) {
return false;
}
vector<vector<vector<bool>>> dp(length, vector<vector<bool>>(length, vector<bool>(length+1, false)));
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++){
dp[i][j][1] = (s1[i] == s2[j]);
}
}
for (int sublen = 2; sublen <= length; sublen++) {
for (int i = 0; i <= length - sublen; i++) {
for (int j = 0; j <= length - sublen; j++) {
for (int k = 1; k < sublen; k++) {
// 第一种情况:S1 -> T1, S2 -> T2
if (dp[i][j][k] && dp[i + k][j + k][sublen - k]) {
dp[i][j][sublen] = true;
break;
}
// 第二种情况:S1 -> T2, S2 -> T1
// S1 起点 i,T2 起点 j + 前面那段长度 len-k ,S2 起点 i + 前面长度k
if (dp[i][j + sublen - k][k] && dp[i + k][j][sublen - k]) {
dp[i][j][sublen] = true;
break;
}
}
}
}
}
return dp[0][0][length];
}
};