使用动态规划找到 A 和 B 的最短交错字符串

Posted

技术标签:

【中文标题】使用动态规划找到 A 和 B 的最短交错字符串【英文标题】:Find the shortest interleaved string of A and B with Dynamic Programming 【发布时间】:2016-10-05 15:14:18 【问题描述】:

我有一个关于动态编程的问题。

给定两个字符串 A 和 B 找到两者中最短的交错字符串。

例如A = "APPLE"B = "ABSOLUTE"

最短的答案是"ABPPSOLUTE" 而是回答我的函数返回"APPABSOLUTE"

我解决这个问题的想法是不断地将 A[0] 和 B[0] 交错len(A)+len(B) 次 但这没有用。

【问题讨论】:

你是否创建了一个函数来交错字符串? 我试过但失败了。我可以创建交错函数,但它不返回最短的交错字符串 你能把你的函数包含在问题中吗? 提示:en.wikipedia.org/wiki/Longest_common_subsequence_problem 【参考方案1】:

这里有一些想法可以帮助您入门。

动态编程的标签wiki将其描述为:

动态规划是一种算法技术,用于有效解决包含许多重叠子问题的递归结构的问题

所以首先,试着想出一种递归解决问题的方法。问:“我怎样才能咬掉这个问题的一小部分并处理它,这样我剩下的就是这个问题的另一个例子”?

在这种情况下,“小块”将是单个字符,剩下的将是字符串中的剩余字符。将问题想象为“这两个字符串的字符的最短交错是什么,从字符串 A 的位置 X 和字符串 B 的位置 Y 开始”?最初调用时,X 和 Y 为 0。

该问题的三个可能答案是:

如果 X 不在 A 的末尾,则从字符串 A 中取出字符 A[X],然后对 X+1,Y 递归求解问题(找到从 X+1 开始的两个字符串的最短交错,Y) 如上所述,但从字符串 B 中取出一个字符而不是 A 并递归求解 X,Y+1 在A[X]和B[Y]的字符相同的情况下,去掉两者的字符,求X+1,Y+1的解

如果 X 和 Y 已经到达 A 和 B 的末尾,则返回一个空字符串。

返回上述 3 中最短的字符串,添加到您取出的 A 或 B(或两者)的字符。

当函数从顶层返回时,您应该得到答案。

这就是“递归”部分。 “重叠子问题”是关于如何重用已经计算过的东西。在这种情况下,您可以创建一个二维字符串数组,表示为 X 和 Y 的所有可能值解决的问题,并且在输入函数时,检查您是否已经有了答案,如果有就返回它。如果没有,则按上述方法计算,然后在从函数返回之前,将要返回的值保存在位置 [X][Y] 的数组中。

【讨论】:

我忘了提到,当我指的是 A 和 B 的交错时,交错需要保持 A 和 B 的顺序(不仅仅是包含相同的字母),你的答案太棒了!我将实现该算法,但它会保留顺序吗?从阅读看起来确实如此,但我想问 是的,它确实保留了顺序,因为 X 和 Y 都从零开始,可以增加但不能减少。 哇哦!作品! :) 谢谢!!

以上是关于使用动态规划找到 A 和 B 的最短交错字符串的主要内容,如果未能解决你的问题,请参考以下文章

动态规划:交错字符串

动态规划之求路径最短

每日一题Day160LC1092最短公共超序列 | 动态规划

交错字符串(动态规划)- leetcode 97

97. 交错字符串-动态规划/dfs+回溯-困难

简言翻译记忆的原理:用动态规划算法求解最短编辑距离