美文网首页
430. 攀爬字符串

430. 攀爬字符串

作者: 薄荷糖的味道_fb40 | 来源:发表于2019-05-23 16:13 被阅读0次

描述

给定一个字符串 s1, 将其递归地分割成两个非空子字符串, 然后可以得到一棵二叉树.

下面是 s1 = "great" 可能得到的一棵二叉树:

      great
     /    \
    gr    eat
   / \    /  \
  g   r  e   at
             / \
            a   t

在攀爬字符串的过程中, 我们可以选择其中任意一个非叶节点, 交换该节点的两个子节点.

例如,我们选择了 "gr" 节点, 并将该节点的两个子节点进行交换, 并且将祖先节点对应的子串部分也交换, 最终得到了 "rgeat". 我们认为 "rgeat" 是 "great" 的一个攀爬字符串.

      rgeat
     /    \
    rg    eat
   / \    /  \
  r   g  e   at
             / \
            a   t

类似地, 如果我们继续将其节点 "eat" 和 "at" 的子节点交换, 又可以得到 "great" 的一个攀爬字符串 "rgtae".

     rgtae
     /    \
    rg    tae
   / \    /  \
  r   g  ta   e
         / \
        t   a

给定两个相同长度的字符串 s1 和 s2,判断 s2 是否为 s1 的攀爬字符串.
你可以从任何一棵 s1 可以构造出的二叉树开始攀爬, 但是在攀爬得到 s2 的过程中不能重新构造二叉树.

样例

样例 1:

输入: s1 = "great", s2 = "rgeat"
输出: true
解释: 如同上面描述的.
样例 2:

输入: s1 = "a", s2 = "b"
输出: false

思路:

dp[i][j][k]表示以s2j-1位为起点长度为k的字符串是否是以s1i-1位为起点长度为k的字符串的攀爬字符串,那么dp[i][j][k]的取值可以表示为:
dp[i][j][k]=OR_{m}\{dp[i][j][m] AND dp[i+m][j+m][k-m] OR dp[i][j+k-m][m] AND dp[i+m][j][k-m]\}
分别代表s1左串匹配s2左串,s1右串匹配s2右串的情况以及s1左串匹配s2右串,s1右串匹配s2左串的情况。具体实现如下所示。

class Solution {
public:
    /**
     * @param s1: A string
     * @param s2: Another string
     * @return: whether s2 is a scrambled string of s1
     */
    bool isScramble(string &s1, string &s2) {
        // write your code here
        int n=s1.size();
        vector<vector<vector<bool>>> dp(n,vector<vector<bool>>(n,vector<bool>(n+1,false)));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                dp[i][j][1]=s1[i]==s2[j]?true:false;
            }
        }
        for(int k=2;k<=n;k++)
        {
            for(int i=0;i<=n-k;i++)
            {
                for(int j=0;j<=n-k;j++)
                {
                    for(int m=1;m<k;m++)
                    {
                        dp[i][j][k]=dp[i][j][k]||(dp[i][j][m]&&dp[i+m][j+m][k-m])||(dp[i][j+k-m][m]&&dp[i+m][j][k-m]);
                    }
                }
            }
        }
        return dp[0][0][n];
    }
};

相关文章

  • 430. 攀爬字符串

    描述 给定一个字符串 s1, 将其递归地分割成两个非空子字符串, 然后可以得到一棵二叉树. 下面是 s1 = "g...

  • 430. 扁平化多级双向链表

    430. 扁平化多级双向链表[https://leetcode-cn.com/problems/flatten-a...

  • 攀爬 攀爬

    是什么在撕扯? 是什么在吼叫? 有多少人在悔恨 有多少人在彷徨 挣扎 捆绑 倾覆 他们的人生 因此 坠落 不断的寻...

  • 攀爬

    习作:攀爬中的兜宝——蹬地 材料:打印纸,签字笔,胶带。 自评:不是圈好结构画的,画完头感觉纸不够,所以身子画胖,...

  • 攀爬

    小宝从去年开始对攀爬表现出特别的兴趣,她把我们附近公园所有能爬的树都爬了一遍,每次外出看到可以攀爬的地方,她也一定...

  • 攀爬

    今天女儿坚持练习攀爬,很努力,虽然她內心惧怕攀爬,但还主动参加练习,其实女儿的动作不够灵敏。我觉察到现在的状态可能...

  • 攀爬

    今天,晚上,我很想哭! 你们看了一定很奇怪,我为什么要哭?下面我就说一说吧。 妈妈说...

  • 攀爬

    从出生 一直在岁月的山上攀爬 云雾缭绕 听过云霄之外的鸟 草本兴盛 嗅过蒲公英的羽毛 星河璀璨 遥遥的,向宇宙延伸...

  • 攀爬

    上面的照片是妞妞在颐和园的一处假山处攀爬时我抓拍的瞬间,小家伙非常喜欢这项活动,大热的天,竟然不厌其烦的爬上来跳下...

  • 攀爬

    从开始认识java,感受到他的迷人之处。到入浅水般略过java,感受到他的辽人之处。 有过为素数而烧...

网友评论

      本文标题:430. 攀爬字符串

      本文链接:https://www.haomeiwen.com/subject/mwlbzqtx.html