在主字符串中查找最小长度以查找第二个字符串的算法

时间:2013-10-07 09:22:35

标签: algorithm

算法有一个问题。

问题如下: -

您将获得一个由字符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

我的工作

  1. 我们可以使用O(n ^ 2)中的强力方法来解决这个问题。
  2. 我们可以使用DP找到主字符串中的第一个序列,我的DP逻辑如下,
  3. 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.
    

    我需要你身边的一些提示。

    请仅提供提示/指导,无需代码或实施。

2 个答案:

答案 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

BCDDP(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时立即停止(这是马上),因为CC短。

旁注:

我认为人们可以比DP方法做得更好,但如果我在这里提出其他建议,可能只会从Find length of smallest window that contains all the characters of a string in another string的答案中复制/启发。