zoukankan      html  css  js  c++  java
  • [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.

    可以用递归来解决,用备忘录方法加速。备忘录也就是DP的一种变形了,所以我就直接改为递推式的DP了。O(n^4)

     1 class Solution {
     2 private:
     3     bool f[100][100][100];
     4 public:
     5     bool isScramble(string s1, string s2) {
     6         // Start typing your C/C++ solution below
     7         // DO NOT write int main() function
     8         if (s1.size() != s2.size())
     9             return false;
    10             
    11         for(int i = 0; i < s1.size(); i++)
    12             for(int j = 0; j < s2.size(); j++)
    13                 f[1][i][j] = (s1[i] == s2[j]);
    14                 
    15         for(int len = 2; len <= s1.size(); len++)
    16         {
    17             for(int s1Beg = 0; s1Beg < s1.size(); s1Beg++)
    18             {
    19                 int s1End = s1Beg + len - 1;
    20                 if (s1End >= s1.size())
    21                     break;
    22                 
    23                 for(int s2Beg = 0; s2Beg < s2.size(); s2Beg++)
    24                 {
    25                     int s2End = s2Beg + len - 1;
    26                     if (s2End >= s2.size())
    27                         break;
    28                     
    29                     f[len][s1Beg][s2Beg] = false;    
    30                     for(int s1Mid = s1Beg; s1Mid < s1End; s1Mid++)
    31                     {
    32                         int leftSize = s1Mid - s1Beg + 1;
    33                         int rightSize = len - leftSize;
    34                         int s2Mid = s2Beg + leftSize - 1;
    35                         bool res1 = f[leftSize][s1Beg][s2Beg] && f[rightSize][s1Mid+1][s2Mid+1];
    36                         
    37                         s2Mid = s2End - leftSize;
    38                         bool res2 = f[leftSize][s1Beg][s2Mid+1] && f[rightSize][s1Mid+1][s2Beg];
    39                         
    40                         f[len][s1Beg][s2Beg] = f[len][s1Beg][s2Beg] || res1 || res2;
    41                     }
    42                 }
    43             }
    44         }
    45         
    46         return f[s1.size()][0][0];
    47     }
    48 };
  • 相关阅读:
    MATLAB中mexFunction函数的接口规范
    opencv 人脸识别 (一)训练样本的处理
    VS 编程常见错误及解决方法
    在用VC编译下debug和release的什么区别
    OpenCV中Mat的详解
    主成份分析PCA
    人脸识别必读的N篇文章
    opencv有关错误及解决办法
    解决办法:CMake编译时出现“error in configuration process project files may be invalid”
    mybatis 学习笔记(二):mybatis SQL注入问题
  • 原文地址:https://www.cnblogs.com/chkkch/p/2778108.html
Copyright © 2011-2022 走看看