[leetcode] Scramble String

来源:互联网 发布:主人网络关闭如何开启 编辑:程序博客网 时间:2024/05/21 17:35

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.

性质:s1和s2是scramble的话,那么必然存在一个在s1上的长度l1,将s1分成s11和s12两段,同样有s21和s22。

方法1:递归

有一种方法叫做简单粗暴。。。

递归+剪枝

[cpp] view plaincopyprint?
  1. bool isScramble(string s1, string s2) {  
  2.         // Note: The Solution object is instantiated only once.  
  3.         if(s1.length() != s2.length()) return false;  
  4.         if(s1 == s2) return true;  
  5.   
  6.         int A[26] = {0};  
  7.         for(int i = 0; i < s1.length(); i++)  
  8.             ++A[s1[i]-'a'];  
  9.   
  10.         for(int j = 0; j < s2.length(); j++)  
  11.             --A[s2[j]-'a'];  
  12.   
  13.         for(int k = 0; k < 26; k++)  
  14.             if(A[k] != 0) return false;  
  15.   
  16.         for(int i = 1; i < s1.length(); i++)  
  17.         {  
  18.             bool result = isScramble(s1.substr(0,i), s2.substr(0,i))   
  19.                 && isScramble(s1.substr(i), s2.substr(i));  
  20.             result = result || (isScramble(s1.substr(0,i), s2.substr(s2.length()-i, i))  
  21.                 && isScramble(s1.substr(i), s2.substr(0,s2.length()-i)));  
  22.             if(result) return true;  
  23.         }  
  24.         return false;  
  25.     }  

方法2:DP

class Solution {public:    bool isScramble(string s1, string s2) {        int n = s1.size();        bool dp[100][100][100] = {0};        memset(dp, 0, sizeof(dp));        // dp[i][j][k]         //  if true, s1[i~i+k], s2[j~j+k] match.        //  else dismatch.        // dp[i][j][k] =         //          (dp[i][j][t] && dp[i+t][j+t][k-t]) ||         //          (dp[i][j+k-t][t] &&dp[i+t][j][k-t]), (1<= t <= k-1)        for (int i = 0; i < n; i++) {            for (int j = 0; j < n; j++) {                dp[i][j][0] = true;                dp[i][j][1] = (s1[i] == s2[j]);            }        }        for (int i = n - 1; i >= 0; i--) {            for (int j = n - 1; j >= 0; j--) {                for (int k = 2; (i+k <= n) && (j+k <= n); k++) {                    for (int t = 1; t < k; t++) {                        if (dp[i][j][k]) break;                        dp[i][j][k] |= (dp[i][j][t] && dp[i+t][j+t][k-t]) ||                                        (dp[i][j+k-t][t] && dp[i+t][j][k-t]);                     }                }            }        }        return dp[0][0][n];;    }};


0 0
原创粉丝点击