• [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 };
  • 相关阅读:
    Asp.net 弹出对话框基类 (输出alet警告框)
    Request.ServerVariables获取环境变量
    Asp.net 字符串操作基类(安全,替换,分解等)
    asp.net 取得远程的IP地址和浏览器类型
    存储过程得到三个值
    弹出无边框网页的Javscrpt代码
    .net打包自动安装数据库!
    精妙Sql语句
    关于跨语言站点搜索结果非预期的问题
    SharePoint服务器场环境安装升级补丁的详细步骤
  • 原文地址:https://www.cnblogs.com/chkkch/p/2778108.html
Copyright © 2020-2023  润新知