思路:如果s1和s2是扰乱字符串的话,那么必然存在一个在s1上的长度l1,将s1分成s11和s12两段,同样有s21和s22.
会有两种情况:1.s11和s21是扰乱字符串并且s12和s22是扰乱字符串;
2.s11和s22是扰乱字符串并且s12和s21是扰乱字符串。
所以只需要遍历字符串,看是都满足上面两种情况的一种即可。
就拿题目中的例子 rgeat 和 great 来说,rgeat 可分成 rg 和 eat 两段, great 可分成 gr 和 eat 两段,rg 和 gr 是扰乱字符串, eat 和 eat 当然是扰乱字符串。
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1.size()!=s2.size()) return false;
if(s1==s2) return true;
string str1=s1,str2=s2;
sort(str1.begin(),str1.end());
sort(str2.begin(),str2.end());
if(str1!=str2) return false;
for(int i=1;i<s1.size();++i)
{
string s11=s1.substr(0,i);
string s12=s1.substr(i);
string s21=s2.substr(0,i);
string s22=s2.substr(i);
if(isScramble(s11,s21)&&isScramble(s12,s22)) return true;
s21=s2.substr(s2.size()-i);
s22=s2.substr(0,s2.size()-i);
if(isScramble(s11,s21)&&isScramble(s12,s22)) return true;
}
return false;
}
};