一开始以为很难, 其实就是递归判断,只要第一次做错的原因是我以为分割点是中间,其实是每一个点都可以是分割点,想想2叉树就想懂的。
2刷应该就用dp吧, 这个也在手动刷一次!理解多一次
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1 == s2) return true;
if(s1.length() == 0) return true;
if(s1.length() != s2.length()) return false;
int mark[26];
int n = s1.length();
memset(mark, 0, sizeof(mark));
for(int i = 0; i < n; ++ i){
mark[s1[i] - 'a']++;
mark[s2[i] - 'a']--;
}
for(int i = 0; i < 26; ++ i)
if(mark[i] != 0)
return false;
for(int i = 1; i < n; ++ i){
if((isScramble(s1.substr(0, i), s2.substr(0, i)) && isScramble(s1.substr(i), s2.substr(i))) ||
(isScramble(s1.substr(0, i), s2.substr(s1.size()-i)) && isScramble(s1.substr(i), s2.substr(0, s1.size()-i)))
)
return true;
}
return false;
}
};