【问题标题】:Compare Multiple Substrings比较多个子串
【发布时间】:2010-09-29 19:25:41
【问题描述】:

我正在尝试编写一个基本的 dna 测序仪。在那里,给定两个相同长度的序列,它将输出相同的字符串,最小长度为 3。 所以输入

abcdef dfeabc

会回来

1 abc

我不知道如何解决这个问题。 我可以比较两个字符串,看看它们是否完全相等。从那里,我可以比较长度为 1 的字符串大小,即如果 dfeabc 包含 abcde。但是,我怎样才能让程序执行所有可能的字符串,最小为 3 个字符? 一个问题是对于上述长度为 1 的示例,我还必须执行字符串 bcdef 并进行比较。

【问题讨论】:

    标签: java substring dna-sequence


    【解决方案1】:

    天真的方法是获取字符串 A 的每个子字符串并查看它是否在字符串 B 中。

    这是一种天真的做法:

    for ( int i = 0; i < a.length; i++ ) {
       for ( int j = i+1; j <= a.length; j++ ) {
           if (b.contains(a.substring(i, j))) {
               //if longer than last found match, record this match
           }
       }
    }
    

    稍微更优化的方法是先查看较长的子字符串,这样第一个匹配的子字符串必然是最长的。

    for ( int length = a.length; length > 0; length-- ) {
         for ( int i = 0; i + length < a.length; i++ ) {
             if ( b.contains(a.substring(i, i+length)) ) {
                 //this is the biggest match
             }
         }
    }
    

    【讨论】:

    • 当然是善意的,但对家庭作业问题的帮助太大了,IMO :-)
    • 嗯,我在想如果这是家庭作业,它似乎是,他可能不允许使用 contains 方法(那是作弊)所以他还有一些空白要填写在。
    • 说实话,这很完美,我已经有一些接近的东西了,我只是没有第二个长度循环来使它正常工作。这是真的,我不能使用包含,所以还有一些事情要做。它甚至不是任务,只是一个实验室,所以我只需要简单的解决方案。
    【解决方案2】:

    如果你想以一种简单的方式解决这个问题,而不使用任何 Java API 进行搜索,你可以这样想:对于第一个字符串中的每一对可能的起始索引 i 和第二个字符串中的 j,步骤在第一个字符串和第二个字符串中的对应字符相等时向前推进,如果您至少执行了 3 步,则返回结果。

    【讨论】:

      【解决方案3】:

      您需要使用最长公共子串算法,这是一个动态规划问题。查看 Wikipedia 的 entry 了解算法说明,查看 here 了解示例实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        • 2014-03-28
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多