Scramble String

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.

Below is one possible representation of s1 = "great":

 great / \ gr eat / \ / \ g r e at / \ a t 

To scramble the string, we may choose any non-leaf node and swap its two children.

For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".

 rgeat / \ rg eat / \ / \ r g e at / \ a t 

We say that "rgeat" is a scrambled string of "great".

Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".

 rgtae / \ rg tae / \ / \ r g ta e / \ t a 

We say that "rgtae" is a scrambled string of "great".

Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

class  Solution {
private:
     void sort( string & s)
    {
         for( int i= 0;i<s.length();i++)
             for( int j=i+ 1;j<s.length();j++)
                 if(s[i]>s[j])
                {
                     char c=s[i];
                    s[i]=s[j];
                    s[j]=c;
                }
    }
     bool checkstr( string s1, string s2)
    {
        sort(s1);
        sort(s2);
         return s1==s2;
    }
    
public:
     bool isScramble( string s1,  string s2) 
    {
         if(s1== ""return s2== "";
         if(checkstr(s1,s2)== falsereturn  false;
         int len=s1.length();
         if(len== 1return  true;
         for( int i= 1;i<s1.length();i++)
        {
             string left=s1.substr( 0,i);
             string right=s1.substr(i);            
             if((isScramble(left,s2.substr( 0,i)) && isScramble(right,s2.substr(i)))
                || (isScramble(left,s2.substr(len-i)) && isScramble(right,s2.substr( 0,len-i))))
             return  true;
        }
         return  false;
    }
};

你可能感兴趣的:(String)