美文网首页
Lintcode430 Scramble String solu

Lintcode430 Scramble String solu

作者: 程风破浪会有时 | 来源:发表于2018-02-24 11:43 被阅读0次

    【题目描述】

    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,将其递归地分割成两个非空子字符串,从而将其表示为二叉树。

    下面是s1 = "great"的一个可能表达:

        great

      /    \

      gr    eat

    / \    /  \

    g  r  e  at

              / \

              a  t

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

    例如,我们选择了 "gr" 节点,并将该节点的两个儿子进行交换,从而产生了攀爬字符串 "rgeat"。

        rgeat

      /    \

      rg    eat

    / \    /  \

    r  g  e  at

              / \

              a  t

    我们认为, "rgeat" 是 "great" 的一个攀爬字符串.

    类似地,如果我们继续将其节点 "eat" 和 "at" 进行交换,就会产生新的攀爬字符串 "rgtae"。

        rgtae

      /    \

      rg    tae

    / \    /  \

    r  g  ta  e

          / \

          t  a

    同样地,"rgtae" 也是 "great"的一个攀爬字符串。

    给定两个相同长度的字符串s1 和 s2,判定 s2 是否为 s1 的攀爬字符串。

    【题目链接】

    www.lintcode.com/en/problem/scramble-string/

    【题目解析】

    这道题用二维数组来存储中间结果不够用了,需要一个三维数组 dp[i][j][len],表示从s1的第i个字符开始长度为len的子串,和从s2的第j个字符开始长度为len的子串,是否互为scramble。

    初始化为dp[i][j][1] = s1.charAt(i) == s2.charAt(j),即长度为1的子串是否互为scramble。

    三维数组就要三层循环,最终结果为dp[0][0][s1.length()],即从s1的第0个字符开始长度为s1.length()的子串,即s1本身和s2本身是否互为scramble。

    要判断dp[i][j][len]的值,就要把s1从i开始长度为len的串分别从k=1, 2 ... len-1处切开,判断切成的两半和s2同样切成的两半是否互为scramble,只要有一种切法满足条件,那么dp[i][j][len]就为true,否则为false。

    【参考答案】

    www.jiuzhang.com/solutions/scramble-string/

    相关文章

      网友评论

          本文标题:Lintcode430 Scramble String solu

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