我对动态编程的问题有疑问。
给定两个字符串 A 和 B 找到两者中最短的交错字符串。
例如对于A = "APPLE"
,B = "ABSOLUTE"
最短的答案将是"ABPPSOLUTE"
代替回答我的函数返回"APPABSOLUTE"
我解决这个问题的想法是不断地交错 A[0] 和 B[0] len(A)+len(B)
但这没有用。
我对动态编程的问题有疑问。
给定两个字符串 A 和 B 找到两者中最短的交错字符串。
例如对于A = "APPLE"
,B = "ABSOLUTE"
最短的答案将是"ABPPSOLUTE"
代替回答我的函数返回"APPABSOLUTE"
我解决这个问题的想法是不断地交错 A[0] 和 B[0] len(A)+len(B)
但这没有用。
这里有一些想法可以帮助您入门。
动态编程的标签 wiki 将其描述为:
动态规划是一种算法技术,用于有效地解决具有包含许多重叠子问题的递归结构的问题
所以首先,试着想办法递归地解决这个问题。问:“我怎样才能咬掉这个问题的一小部分并处理它,这样我剩下的就是这个问题的另一个例子”?
在这种情况下,“小块”将是单个字符,剩下的将是字符串中的剩余字符。将问题想象为“这两个字符串的字符的最短交错是什么,从字符串 A 的位置 X 和字符串 B 的位置 Y 开始”?最初调用它时,X 和 Y 为 0。
该问题的三个可能答案是:
如果 X 和 Y 已经到达 A 和 B 的末尾,则返回一个空字符串。
返回上述 3 中最短的字符串,添加到您取出的 A 或 B(或两者)中的字符。
当函数从顶层返回时,您应该得到答案。
这就是“递归”部分。“重叠子问题”是关于如何重用已经计算过的东西。在这种情况下,您可以创建一个二维字符串数组,表示为 X 和 Y 的所有可能值解决的问题,并且在输入函数时,检查您是否已经有了答案,如果有就返回它。如果不是,则按上述方法计算,然后在从函数返回之前,将要返回的值保存在位置 [X][Y] 的数组中。