我写了一个代码,找到了四种不同的字符序列。
ATG始终处于起步阶段,TAG,TGA或TAA是"停止"序列。
START和STOP序列之间的字符数应为3的倍数。
例如,在以下字符串中:ACC ATG CCC TAG TTT我的程序返回 ATG CCC TAG 。
在此字符串中:AA ATG CC TAG T TAA 程序返回 ATG CCTAGT TAA ,因为ATG和TGA之间的字符数不是三的倍数,所以它寻找下一个"停止"序列,在这种情况下是TAA。
以下是代码:
public class TagFinder {
public String findProtein(String dna) {
String fpL = dna.toLowerCase();
int start = fpL.indexOf("atg");
int stop = fpL.indexOf("tag", start+3);
int stop2 = fpL.indexOf("tga", start+3);
int stop3 = fpL.indexOf("taa", start+3);
if (start == -1) {
return "";
}
if ((stop - start) % 3 == 0) {
return fpL.substring(start, stop+3);
}
if ((stop2 - start) % 3 == 0) {
return fpL.substring(start, stop2+3);
}
if ((stop3 - start) % 3 == 0) {
return fpL.substring(start, stop3+3);
}
else {
return "";
}
}
但是,在以下字符串" ATT ATG CCC TAA TAG"中,代码首先会找到 ATG CCCTAA TAG ,即使TAA是第一个"停止"字符串中的序列和ATG与TAA之间的字符数为3.
我怎样才能编写这个程序,以便在#34; STOP"序列首先出现在字符串中,并且返回起始序列的n3。
谢谢。
答案 0 :(得分:0)
来自
if ((stop - start) % 3 == 0) {
return fpL.substring(start, stop+3);
}
首先找到TAG并调用return语句。如果您确实想要找到第一个停止点,请在stop
,stop2
和stop3
之间添加一些comaprison逻辑,以找出哪个是最小的索引。然后对每个进行% 3
检查并从第一个确定返回,或者如果没有有效的情况则返回整个字符串。还有如何使用正则表达式来解决这个问题? (ATG)\w{3}(TAG|TGA|TAA)
。
答案 1 :(得分:0)
您需要确定所有停止标记的最小值,因此我写下这样的内容:
[...]
int minStop = MAXINT;
if ((stop - start) % 3 == 0 && minStop > stop) {
minStop = stop;
}
if ((stop2 - start) % 3 == 0 && minStop > stop2) {
minStop = stop2;
}
if ((stop3 - start) % 3 == 0 && minStop > stop3) {
minStop = stop3;
}
if (minStop < MAXINT) {
return fpL.substring(start, minStop+3);
} else {
[...]
}
答案 2 :(得分:0)
以下代码使用任何搜索词的列表,然后选择最小匹配索引。
public String findProtein(String dna) {
String fpL = dna.toLowerCase();
int start = fpL.indexOf("atg");
List<String> searchWords = new ArrayList<>();
searchWords.add("tag");
searchWords.add("tga");
searchWords.add("taa");
int start = fpL.indexOf("atg");
try{
int startIndex = searchWords.stream().mapToInt(word -> fpL.indexOf(word, 3 + start)).filter(idx -> idx >= 0 && 0 == idx % 3)
.min().getAsInt();
return dna.substring(start, startIndex + 3);
} catch(NoSuchElementException ex) {
return "";
}
}
答案 3 :(得分:0)
正则表达式可以。
String input = "ACCATGCCCTAGTTT";
String expected = "ATGCCCTAG";
Pattern pattern = Pattern.compile("(ATG)(.{3})*?(TAG|TGA|TAA)",
Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(input);
while (m.find()) {
System.out.printf("[%d] %s%n", m.start(), m.group());
}
在上面,起始位置不一定是3的倍数。如果起始位置必须是3的倍数,那么最容易制作3个字母和分隔符的组。
input = input.replaceAll(".{3}", "$0,");
Pattern pattern = Pattern.compile("(ATG,)(.{4})*?(TAG|TGA|TAA),",
Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(input);
while (m.find()) {
System.out.printf("[%d] %s%n", m.start() * 3 / 4, m.group().replace(",", ""));
}
答案 4 :(得分:0)
代码找到&#34; TAG&#34;首先是因为你编写代码的方式:
您的第一个if
语句会检查&#34; TAG&#34;。如果找到一个,则返回&#34; ATG&#34;之间的字符串。和&#34; TAG&#34;并终止。
您需要做的是创建一个min
变量并将找到的终止密码子的值存储在此min
中(在检查它之后真的是最小值)。不要在搜索终止密码子的return
语句中使用if
。并且仅在执行了三个min + 3
语句后返回if
并确定了与#34; TAG&#34;的实际最小距离。
希望它有用。