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