算法有一个问题。
问题如下: -
您将获得一个由字符A,B,C,D组成的蛋白质字符串。您必须找到最小长度序列。
示例
0 1 2 3 4 5 6 7 8 9 10 11 12
A B A C D C A B C D C C D
String to find is : BCD
This string is find between (StartPoint, EndPoint)
1, 4
7, 9
1, 12
7, 12
Minimum length is of 7, 9.
So the answer is 7, 9
我的工作
A = Main string B = String to be find DP = Dynamic programming function n = A.size, m = B.size Build an array of DP[m+1][n+1] DP[i][j], means If in A[0...i], B[0...j] is present or not. This way we can find our first occurence of B in A. Now after this, I am stuck.
我需要你身边的一些提示。
请仅提供提示/指导,无需代码或实施。
答案 0 :(得分:0)
您的示例问题及其解决方案清楚地表明解决方案始终是一个数字对,包含子串的第一个字母的位置和子串的最后一个字母的位置,即
If the substring is BCD, then solution will be position of B, position of D
如果子串的其余部分(在这种情况下为C)落在解决方案对之间。
因此,为了给出提示,我们可以从主字符串中查找子字符串的第一个字母的位置开始,并将这些位置存储在数组中。类似地,我们可以找到子串的最后一个字母的位置并将它们存储在一个数组中。这将为我们提供一组可能的解决方案集,其中每对将包含来自阵列1的一个数字和来自数组2的一个数字,使得来自数组2的数字大于来自数组1的数字。现在我们可能最终观察到存在没有这样的对,这意味着没有解决方案,即主字符串中不存在子字符串,或者我们最终可能找到一个或多个这样的对,这意味着可以有一个解决方案。现在剩下要做的就是找出解决方案对之间是否存在其余的子串。如果在末尾找到多个这样的对,那么只有更高的数字减去更低的数字应该解析为正确的解决方案。希望这会有所帮助,如你所说,你不想知道整个答案,你只是在寻找提示:)
答案 1 :(得分:0)
根据这个例子,我假设搜索字符串需要按照给定的顺序找到(即ACB
不是ABC
的有效查找。)
一般DP方法/提示:
我们试图最小化的函数是到目前为止的距离,所以这应该是存储在矩阵的每个单元格中的值。
对于字符串中的某个位置和搜索字符串中的某个位置,我们需要回顾搜索字符串中一个位置的字符串中的所有先前位置。对于所有这些,我们需要添加距离并记录最小值。
为了说明,假设搜索字符串为A, B, C, D
。然后,对于搜索字符串中的ABC
和字符串中的i
位置,我们需要查看0
到[{1}}的{{1}}位置。
给定一个字符串i-1
和一个搜索字符串AB
,当查看两者的最后一个位置时,我们会有类似的内容:
BACCD
但BCD
和DP(BACCD, BCD) = min(4+DP(B, BC), 3+DP(BA, BC), 2+DP(BAC, BC), 1+DP(BACC, BC))
无效,因为DP(B, BC)
和DP(BA, BC)
不包含B
,更具体地说,不以{BA
结尾{1}}(因此可以为它们分配一些任意大的值)。
一旦我们到达搜索字符串中的最后一个字符,该值将表示我们找到了完整的搜索字符串,从字符串中的该位置结束,因此它应该与全局最小值进行比较。
<强>优化强>
要获得BC
而不是C
运行时间,值得注意的是,只要看到另一个当前字母,就可以停止向后迭代(因为,到目前为止的任何序列都是比同一序列长,只有最后一个字母向前移动),即:
给定字符串O(m*n)
和搜索字符串O(m*n^2)
,在检查第二个ABCCD
时,我们可以在到达第一个ABC
时立即停止(这是马上),因为C
比C
短。
旁注:
我认为人们可以比DP方法做得更好,但如果我在这里提出其他建议,可能只会从Find length of smallest window that contains all the characters of a string in another string的答案中复制/启发。