【问题标题】:Finding the longest substring between a "start" string and one of 3 possible "end" strings查找“开始”字符串和 3 个可能的“结束”字符串之一之间的最长子字符串
【发布时间】:2013-11-10 06:53:59
【问题描述】:

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

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

所以:

开始字符串: “ATG”

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

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

我不能使用正则表达式。

感谢您的帮助!

【问题讨论】:

  • What have you tried? 我的意思是除了问我们。
  • 看来最长的子串是ATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAG。你怎么说ATGDFSDFAKJDNKSJFNSDTGA 最长?我不明白。

标签: java string parsing indexing


【解决方案1】:

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

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

要查找索引:

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

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

【讨论】:

    【解决方案2】:

    嗯,这看起来很有趣。

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

    如果您击中“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();
    }
    

    【讨论】:

      【解决方案3】:

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

      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());
          }
      

      【讨论】:

        【解决方案4】:

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

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

        首先,找到起始字符串的索引,然后找到每个结束字符串的索引,并获取每个结尾的子字符串,然后是它们的长度。请记住,如果未找到字符串,则其索引将为 -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。

        【讨论】:

          猜你喜欢
          • 2010-11-04
          • 2014-12-07
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2020-05-28
          • 2013-09-13
          相关资源
          最近更新 更多