动态编程:拉链

时间:2013-05-08 14:26:28

标签: algorithm dynamic-programming

在动态编程问题上做一些练习,为我的决赛做准备,我发现这个问题困扰了我。

拉链:给定三个字符串,您要确定是否可以通过组合前两个字符串中的字符来形成第三个字符串。前两个字符串可以任意混合,但每个字符串必须保留在第三个字符串中的原始顺序。

例如,考虑从“猫”和“树”形成“tcarete”: 字符串A:c a t 字符串B:e 字符串C:t c a r e t e

正如你所看到的,我们可以通过选择“tree”的第一个字符来形成字符串C,然后是“cat”的前2个字符,接着是“tree”的第二个和第三个字符,接着是最后一个字符。分别是“猫”和“树”的字符。

作为第二个例子,考虑从“猫”和“树”形成“catrtee”: 字符串A:c a t 字符串B:e 字符串C:c a t r t e e

此输入的答案也是'是'

输出:如果A和B可以组合(拉链)到字符串C,则输出yes。   如果A和B不能组合成C,则输出no。

所以基本上我们想看看第三个字符串C是否可以由A和B组成。 就像是 C T R T E A E输出编号 我最大的问题是猫和树都有字母T。所以我不能只运行一个算法来检查一个字母是否跟随另一个字母。对此有何帮助?

1 个答案:

答案 0 :(得分:3)

因为您正在审查动态编程,所以将它用于此问题应该是很自然的。

现在,让我们这样思考:

  1. 对于整个字符串C,如果它是A和B的混合,那么它的第一个字符必须是A的第一个字符,或者是B中的第一个字符;
  2. 现在更进一步,C中的第一个k个字符,kA< k他们必须来自A,kB = k - kA他们必须来自B。
  3. 由此,不难发现使用O(min(len(A),len(B)))空间并使用O(len(C)* min(len(A),len)的算法(B)))运行。

    提示:对于C的每一步,A中的某些位置必须为“On”,而其他位置为“off”。最后,如果消耗了两个字符串中的所有字符,则可以从A和B生成C.