2

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

abcdef dfeabc

将返回

1 abc

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

4

3 回答 3

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
         }
     }
}
于 2010-09-29T19:31:18.633 回答
0

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

于 2010-09-29T19:32:57.090 回答
0

您需要使用最长公共子串算法,这是一个动态规划问题。查看 Wikipedia 的条目以获取算法的解释,并在此处查看示例实现。

于 2010-09-29T19:55:23.180 回答