1 class Solution {
2 public:
3 bool isScramble(string &s1, string &s2, int start1, int end1, int start2, int end2){
4 if (end1-start1 != end2-start2)
5 return false;
6 if (end1-start1 < 0)
7 return true;
8 int len = end1-start1+1;
9 if (len==1){
10 if (s1.at(start1) == s2.at(start2))
11 return true;
12 return false;
13 }
14 int *f = new int [128];
15 int *g = new int [128];
16 for (int i=0; i<128; i++){
17 f[i] = 0;
18 g[i] = 0;
19 }
20 int * flag = new int[len];
21 int tDifs = 0;
22 int rDifs = 0;
23 for (int i=0; i<len; i++){
24 int p = (int)s1.at(i+start1);
25 f[p]++;
26 if (f[p]==1)
27 tDifs++;
28 else if (f[p]==0)
29 tDifs--;
30 int q = (int)s2.at(i+start2);
31 f[q]--;
32 if (f[q]==-1)
33 tDifs++;
34 else if (f[q]==0)
35 tDifs--;
36 int r = (int)s2.at(end2-i);
37 g[p]++;
38 if (g[p]==1)
39 rDifs++;
40 else if (g[p]==0)
41 rDifs--;
42 g[r]--;
43 if (g[r]==-1)
44 rDifs++;
45 else if (g[r]==0)
46 rDifs--;
47 flag[i] = 0;
48 if (tDifs==0)
49 flag[i]+=1;
50 else if (rDifs==0)
51 flag[i]+=2;
52 }
53 int rlt = 0;
54 if (tDifs!=0)
55 rlt = -1;
56 for (int i=0; i<len-1 && rlt==0; i++){
57 if (flag[i]%2==1 && isScramble(s1,s2,start1, start1+i, start2,start2+i) && isScramble(s1,s2,start1+i+1,end1,start2+i+1, end2)){
58 rlt =1;
59 break;
60 }
61 if (flag[i]/2==1 && isScramble(s1,s2,start1, start1+i, end2-i,end2) && isScramble(s1,s2,start1+i+1,end1,start2, end2-i-1)){
62 rlt =1;
63 break;
64 }
65 }
66 delete []f;
67 delete[]g;
68 delete[]flag;
69 if (rlt==1)
70 return true;
71 return false;
72 }
73 bool isScramble(string s1, string s2) {
74 // IMPORTANT: Please reset any member data you declared, as
75 // the same Solution instance will be reused for each test case.
76 return isScramble(s1,s2,0,s1.length()-1, 0, s2.length()-1);
77 }
78 };