方法一:递归
class Solution {
public:
bool isScramble(string s1, string s2) {
int len1 = s1.length();
int len2 = s2.length();
if(len1 != len2) {
return false;
}
if(len1 == 1) {
return s1 == s2;
}
string str1 = s1, str2 = s2;
sort(str1.begin(), str1.end());
sort(str2.begin(), str2.end());
for(int i = 0; i < len1; ++i) {
if(str1[i] != str2[i]) {
return false;
}
}
bool res = false;
for(int i = 1; i < len1 && !res; ++i) {
res = isScramble(s1.substr(0, i), s2.substr(0, i)) && isScramble(s1.substr(i, len1 - i), s2.substr(i, len1 - i));
if(!res) {
res = isScramble(s1.substr(0, i), s2.substr(len1 - i, i)) && isScramble(s1.substr(i, len1 - i), s2.substr(0, len1 - i));
}
}
return res;
}
};
方法二:DP
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1.length() != s2.length()) {
return false;
}
int len = s1.length();
bool states[len + 1][len][len];
memset(states, false, sizeof(states));
// vector<vector<vector<bool>>> states = vector<vector<vector<bool>>>(len+1, vector<vector<bool>>(len, vector<bool>(len, false)));
for(int l = 1; l <= len; ++l) {
for(int i = 0; i <= len - l; ++i) {
for(int j = 0; j <= len - l; ++j) {
if(l == 1) {
states[l][i][j] = (s1[i] == s2[j]);
}else {
for(int k = 1; k < l; ++k) {
if((states[k][i][j] && states[l - k][i + k][j + k]) || (states[k][i][j + l - k] && states[l - k][i + k][j])) {
states[l][i][j] = true;
}
}
}
}
}
}
return states[len][0][0];
}
};