代码改变世界

leetcode - Scramble String

2013-12-06 11:13  张汉生  阅读(121)  评论(0编辑  收藏  举报

 

 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 };