【leetcode】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.

 
 
1. 如果两个substring相等的话,则为true
2. 如果两个substring中间某一个点,左边的substrings为scramble string, 同时右边的substrings也为scramble string,则为true
3. 如果两个substring中间某一个点,s1左边的substring和s2右边的substring为scramble string, 同时s1右边substring和s2左边的substring也为scramble string,则为true
 
 
 1 class Solution {

 2 public:

 3     bool isScramble(string s1, string s2) {

 4        

 5         int n=s1.length();

 6         vector<vector<vector<bool>>> dp(n,vector<vector<bool>>(n,vector<bool>(n+1)));

 7         //dp[i][j][k] represent whether s1[i,i+1,...,i+k-1] and  s2[j,j+1,...,j+k-1] is scramble

 8        

 9        

10         for(int i=n-1;i>=0;i--)

11         {

12             for(int j=n-1;j>=0;j--)

13             {

14                 for(int k=1;k<=n-max(i,j);k++)

15                 {

16                     if(s1.substr(i,k)==s2.substr(j,k))

17                     {

18                         dp[i][j][k]=true;

19                     }

20                     else

21                     {

22                         for(int l=1;l<k;l++)

23                         {

24                             if(dp[i][j][l]&&dp[i+l][j+l][k-l]||dp[i][j+k-l][l]&&dp[i+l][j][k-l])

25                             {

26                                 dp[i][j][k]=true;

27                                 break;

28                             }

29                         }

30                

31                     }

32                 }

33             }

34  

35         }

36         return dp[0][0][n];

37     }

38 };

 

你可能感兴趣的:(LeetCode)