查找“start”字符串与3个可能的“end”字符串之一之间的最长子字符串

时间:2013-11-10 06:53:59

标签: java string parsing indexing

所以我的问题是与子串相关的。

如何在起始字符串和三个结束字符串之一中找到最长的子字符串?我还需要找到最大子字符串起始的原始字符串的索引。

所以:

开始字符串: “ATG”

3个可能的结束字符串: “标签” “TAA” “TGA”

示例原始字符串可能是: “SDAFKJDAFKATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAGSDFSDATGFF” 所以结果应该给我: - 最长子串长度:23(来自子串ATGDFSDFAKJDNKSJFNSDTGA) - 最长子串的索引:10

我无法使用正则表达式。

感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

嗯,这看起来很有趣。

这样做最直接的方法似乎是构建自己的迷你有限状态机。您必须解析字符串中的每个字符,并跟踪将终止序列的所有可能的字符序列。

如果你点击'T',你需要跳到前面看下一个字符。如果它是'A'或'G'你需要再次向前跳,否则,将这些标记添加到你的字符串中。继续模式,直到到达原始字符串的末尾,或匹配其中一个终端模式。

所以,也许是这样的事情(简化示例):

String longestSequence(String original) {
  StringBuilder sb = new StringBuilder();
  char[] tokens = original.toCharArray();
  for (int i = 0; i < tokens.length; ++i) {
    // read each token, and compare / look ahead to see if you should keep going or terminate.
  }
  return sb.toString();
}

答案 1 :(得分:0)

将您的字符串与此正则表达式匹配:

ATG[A-Z]+(TAG|TAA|TGA)

如果发生多个匹配,则迭代并保留最长的一个。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

    // using pattern with flags
    Pattern pattern = Pattern.compile("ATG[A-Z]+(TAG|TAA|TGA)");

    Matcher matcher = pattern.matcher( yourInputStringHere );

    while (matcher.find()) {
        System.out.println("Found the text \"" + matcher.group()
                + "\" starting at " + matcher.start()
                + " and ending at index " + matcher.end());
    }

答案 2 :(得分:0)

这可以说是最简单的方法,它只是一行:

String target = str.replaceAll(".*ATG(.*)(TAG|TAA|TGA).*", "$1");

查找索引:

int index = str.indexOf("ATG") + 3;

注意:我已将您的评论“我不能使用正则表达式”解释为“我在正则表达式上不熟练”,因为如果它是一个java问题,则可以使用正则表达式。

答案 3 :(得分:0)

你的问题已经有了一些美丽而优雅的解决方案(波希米亚和好奇)。如果您仍然 - 如最初所述 - 不能使用正则表达式,这里是另一种选择。这段代码并不是特别优雅,而且正如所指出的那样,有更好的方法可以做到这一点,但它至少应该清楚地向您展示解决问题背后的逻辑。

  

如何在起始字符串之间找到最长的子字符串   和三个结束字符串之一?

首先,找到起始字符串的索引,然后找到每个结束字符串的索引,并获得每个结尾的子字符串,然后获取它们的长度。请记住,如果找不到字符串,其索引将为-1。

    String originalString = "SDAFKJDAFKATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAGSDFSDATGFF";

    String STARTING_STRING = "ATG";

    String END1 = "TAG";
    String END2 = "TAA";
    String END3 = "TGA";

    //let's find the index of STARTING_STRING
    int posOfStartingString = originalString.indexOf(STARTING_STRING);

    //if found
    if (posOfStartingString != -1) {
        int tagPos[] = new int[3];

        //let's find the index of each ending strings in the original string
        tagPos[0] = originalString.indexOf(END1, posOfStartingString+3);
        tagPos[1] = originalString.indexOf(END2, posOfStartingString+3);
        tagPos[2] = originalString.indexOf(END3, posOfStartingString+3);

        int lengths[] = new int[3];

        //we can now use the following methods:
        //public String substring(int beginIndex, int endIndex)
        //where beginIndex is our posOfStartingString
        //and endIndex is position of each ending string (if found)
        //
        //and finally, String.length() to get the length of each substring

        if (tagPos[0] != -1) {
            lengths[0] = originalString.substring(posOfStartingString, tagPos[0]).length();
        }
        if (tagPos[1] != -1) {
            lengths[1] = originalString.substring(posOfStartingString, tagPos[1]).length();
        }
        if (tagPos[2] != -1) {
            lengths[2] = originalString.substring(posOfStartingString, tagPos[2]).length();
        }

    } else {
        //no starting string in original string
    }    

lengths []表现在包含以STARTING_STRING开头的字符串长度和3个相应的结尾。然后找到哪一个最长,你会得到答案。

  

我还需要找到最大子字符串起始的原始字符串的索引。

这将是起始字符串开始的索引,在本例中为10。