【问题标题】:Given string x,y and z. Determine if z is a shuffle给定字符串 x,y 和 z。确定 z 是否是随机播放
【发布时间】:2014-11-23 16:16:08
【问题描述】:

我正在尝试这个问题:

假设给定三个字符串:X、Y 和 Z,其中 |X| = n, |Y| = m,和 |Z| = n+m.Z 被认为是 X 和 Y 的洗牌当且仅当 Z 可以通过将 X 和 Y 中的字符以保持每个字符串中字符从左到右排序的方式交错来形成。

给出一个有效的算法来确定 Z 是否是 X 和 Y 的混洗。

提示:你构造的动态规划矩阵的值应该是布尔值,而不是数字

我不明白为什么每个人都提出动态规划递归解决方案。

我们不能只做下面的 n+m 算法吗:

  1. 维护两个指针i和j,i指向字符串x中的字符,j指向字符串y。

  2. 通过z迭代(使用迭代器k),对于每个char z[k],如果它匹配x[i],则增加i,如果它匹配y[j],则增加j

    2.1。如果 k > i+j 则返回 false

    2.2。如果 k == z.length() 和 i 或 j != x.length(), y.length() 分别返回 false

  3. 返回true

根据 Tanmay Patil 的帖子编辑

【问题讨论】:

  • 当 x [i] == y [j] 时,您可能会遇到回溯问题,因此您不知道在某个点消耗哪个
  • 也许我没看懂你的帖子,但这不是递归的,你为什么要使用回溯?
  • 这里没有考虑太多,但是在某些时候,您会遍历两个字符串中当前都存在的字符“x”,并且使用正确的字符很重要(迭代正确的指针) .另一个问题可能是,dp 算法可能更快。
  • 也许我只是错过了一个重要的事实,它会阻止你的算法这样做
  • 为什么正确食用很重要?

标签: algorithm


【解决方案1】:

嗯,问题陈述清楚地说明了

给出一个高效的动态规划算法

这样就可以解释了

每个人都在提出一个动态规划递归解决方案


即使那样,也可以像您提到的那样以迭代的方式解决它。而且它不是n^2算法,它的时间复杂度是n+m

祝你好运。

【讨论】:

  • 上述迭代解法不正确。例如。如果 X = xb,Y = xa,Z = xaxb。谢谢 Terry Storm,在主要问题的 cmets 中进一步讨论。
  • 这是一个经典的下推自动机问题,你需要一个堆栈来回溯。但它仍然可以以迭代的方式完成。 (不完全像你提到的那样。)
【解决方案2】:

你是对的。

您永远必须使用递归算法。您可以随意这样做,但您可以始终使用交互例程。

在本例中,您可以使用数组或分配足够大的内存块来保存结果。

【讨论】:

  • 我的意思是,上面提出的算法 iv 是不是错了,如果不是,那为什么还要经历 DP 的地狱呢?
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2016-02-16
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多