• LeetCode_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.
    

      三维动态规划:  f(i, j, n) = || ((f(i, j, m) && f(i + m, j + m, n - m)) || f(i, j + n - m, m) && f(i + m, j, n - m)) for 1 <= m < n where f(i, j, n) is true iff substring starts at s1[i] and substring starts at s2[j] both with length n are scrambled

    class Solution {
    public:
        bool isScramble(string s1, string s2) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int n = s1.size();
            if (s2.size() != n) return false;
            if(s1 == s2 ) return true;
    
            bool f[n][n][n+1];
            
            for(int i= 0; i< n; i++)
                for(int j = 0; j< n; j++)
                {
                    f[i][j][0] = true;//len 0 其实没用,只是为了k 的编程容易而已
                    f[i][j][1] = s1[i] == s2[j] ;
                }
                
            for(int len = 2; len <= n; len ++)
                for( int i = 0; i + len -1 < n;i++)
                    for(int j = 0; j + len -1 <n;j++)
                    {
                        f[i][j][len] = false;
                        for(int k = 1; k< len ; k++){
                            if ( (f[i][j][k] && f[i+k][j+k][len-k]) ||
                                    (f[i][j+len-k][k] && f[i+k][j][len-k]) )
                                    {
                                         f[i][j][len] = true;
                                         break;
                                    }
                        }
                    }
                    
            return f[0][0][n];
        }
    };
  • 相关阅读:
    汽车租赁系统
    两种设计模式(2)==>>"单例"
    两种设计模式(1)==>>“简单工厂”
    面向对象设计的七大原则
    springboot中的mybatis是如果使用pagehelper的
    vue
    vue
    vue
    idea快捷键
    idea部署tomcat项目时,在项目里打断点不能拦截
  • 原文地址:https://www.cnblogs.com/graph/p/3260810.html
Copyright © 2020-2023  润新知