class Solution {
public:
bool isScramble2(string s1, string s2) {
int n = s1.length();
if (n <= 3) return true;
//from left
int match = 0;
for (int i = 0; i < n; ++i) {
++count[s1[i]];
if(count[s1[i]] == 0) --match;
else if(count[s1[i]] == 1) ++match;
--count[s2[i]];
if(count[s2[i]] == 0) --match;
else if(count[s2[i]] == -1) ++match;
if (match == 0 && i < n - 1) {
if (isScramble2(s1.substr(0, i + 1), s2.substr(0, i + 1)) &&
isScramble2(s1.substr(i + 1, n - i - 1), s2.substr(i + 1, n - i - 1)))
return true;
break;
}
}
//from right
for (int i = 0; i < n; ++i) {
++count[s1[i]];
if(count[s1[i]] == 0) --match;
else if(count[s1[i]] == 1) ++match;
--count[s2[n - 1 - i]];
if(count[s2[n - 1 - i]] == 0) --match;
else if(count[s2[n - 1 - i]] == -1) ++match;
if (match == 0 && i < n - 1) {
if (isScramble2(s1.substr(0, i + 1), s2.substr(n - 1 - i, i + 1)) &&
isScramble2(s1.substr(i + 1, n - i - 1), s2.substr(0, n - i - 1)))
return true;
break;
}
}
return false;
}
bool isScramble(string s1, string s2) {
if (s1.length() != s2.length())
return false;
memset(count, 0, sizeof(count));
string ss1 = s1, ss2 = s2;
sort(ss1.begin(), ss1.end());
sort(ss2.begin(), ss2.end());
for (int i = 0; i < s1.length(); ++i) {
if (ss1[i] != ss2[i]) return false;
}
return isScramble2(s1, s2);
}
private:
int count[256];
};