所以我的问题是与子串相关的。
如何在起始字符串和三个结束字符串之一中找到最长的子字符串?我还需要找到最大子字符串起始的原始字符串的索引。
所以:
开始字符串: “ATG”
3个可能的结束字符串: “标签” “TAA” “TGA”
示例原始字符串可能是: “SDAFKJDAFKATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAGSDFSDATGFF” 所以结果应该给我: - 最长子串长度:23(来自子串ATGDFSDFAKJDNKSJFNSDTGA) - 最长子串的索引:10
我无法使用正则表达式。
感谢您的帮助!
答案 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。