使用动态规划找到 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 的最短交错字符串的主要内容,如果未能解决你的问题,请参考以下文章