题解
符号:
- S_(i-j):表示字符串s下标从i到j的字串。
思路
其实没什么规律,就是暴力枚举交换轴,然后每次有交换与不交换两种情况,递归判断是否可行。唯一剪枝就是假如S1_(i,j)=S2_(k,l),则他们所包含的字母的集合是相同的,如果不同,则不用再继续递归下去。
代码
class Solution {
public:
int *sum1,*sum2;
bool dfs(int l1,int r1,int l2,int r2,string &s1,string &s2){
if(sum1[r1+1]-sum1[l1]!=sum2[r2+1]-sum2[l2]) return false;
if(l1==r1){
return s1[l1]==s2[l2];
}
int res =0;
for(int i=0;i<r1-l1+1-1;i++){
res|=dfs(l1,l1+i,l2,l2+i,s1,s2)&&dfs(l1+i+1,r1,l2+i+1,r2,s1,s2);
if(res) break;
res|=dfs(l1,l1+i,r2-i,r2,s1,s2)&&dfs(l1+i+1,r1,l2,r2-i-1,s1,s2);
if(res) break;
}
return res;
}
bool isScramble(string s1, string s2) {
if(s1.size()==0) return true;
sum1= new int[s1.size()+1];
sum2 = new int[s2.size()+1];
sum1[0]=sum2[0]=0;
for(int i=0;i< s1.size();i++){
sum1[i+1]=(sum1[i]+((s1[i]*s1[i])^123563));
sum2[i+1]=(sum2[i]+((s2[i]*s2[i])^123563));
}
return dfs(0,s1.size()-1,0,s2.size()-1,s1,s2);
return false;
}
};