首页 > 代码库 > Scramble String

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