Lintcode430 Scramble String solu

2018-02-24  本文已影响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/

上一篇下一篇

猜你喜欢

热点阅读