所以如果序列1:CAG和序列2:AG,我应该得到答复
"Best alignment score :2 CAG AG"
但我得到了
"Best alignment score :0 CAG AG"
我认为我的问题出现在第二个if语句中,就像调试器的情况一样。
使用调试器时,它显示计算机没有进入if语句。
public static int allignment (String dnaSequence1 , String dnaSequence2 /*,int offset*/){
int newScore = 0;
int bestScore = 0;
int newOffset = 0;
int bestOffset = 0;
for(int offset =0; offset<=(dnaSequence1.length()-dnaSequence2.length());offset++){
//newOffset ++;
newScore = 0;
for(int place =0; place<dnaSequence2.length();place++ ){
if(dnaSequence1.charAt(place) == dnaSequence2.charAt(place/*+offset*/)){
newScore ++;
if(newScore>bestScore){
bestScore = newScore;
bestOffset = newOffset;
}
}else{ continue;}
}
newOffset ++;
}
String space = " ";
System.out.println("Best alignment score :"+bestScore);
System.out.println(dnaSequence1);
System.out.print( space(bestOffset) + dnaSequence2);
int alignmentScore = dnaSequence1.compareToIgnoreCase(dnaSequence2);
return alignmentScore;
}
public static String space (int bestOffset){
String space = " ";
String offsetScaces = "";
for(int i = 0; i<bestOffset; i++){
offsetScaces+=space;
return offsetScaces;
}
return offsetScaces;
}
答案 0 :(得分:1)
您的版本对两个字符串使用相同的索引。因此它检查sequence1
('C')中索引0处的核苷酸是否匹配sequence2
('A')中索引0处的核苷酸,然后它递增索引并检查索引处的核苷酸是否为1 in sequence1
('A')匹配sequence2
('G')中索引1处的核苷酸,然后它停止而没有找到匹配。
012
CAG
AG
从上面的例子可以看出,第一个字符串中的字符在任何时候都与第二个字符串相同(0:C / A,1:A / G,2:G / null)
令我印象深刻的是,你可能正在寻找与dnaSequence1中的某个东西对齐的最长的dnaSequence2,而不仅仅是从索引0开始的最长的一段。
该版本试图在第一个序列中找到整个第二个序列,如果不能,则从第二个序列的末尾修剪1个核苷酸并再次尝试。一旦它将第二个序列修剪为空,它将从整个第二个序列开始,并从开始修剪1个核苷酸并重复该过程(如果找到匹配则停止)
public static int allignment(String dnaSequence1, String dnaSequence2 /*,int offset*/) {
int bestScore = -1;
int bestOffset = 0;
String bestSequence = null;
for(String tempSequence = dnaSequence2; tempSequence.length() > 0; tempSequence = tempSequence.substring(1)) {
for(String match = tempSequence; match.length() > 0; match = match.substring(0, match.length() - 1)) {
int matchIndex;
if (-1 != (matchIndex = dnaSequence1.indexOf(match))) {
if (match.length() > bestScore) {
bestOffset = matchIndex;
bestScore = match.length() ;
bestSequence = match;
break;
}
}
}
if (null != bestSequence && bestScore > tempSequence.length()) {
break; // don't bother checking any shorter sequences, we already have a better match
}
}
if (null != bestSequence) {
System.out.println("Best alignment score :" + bestScore);
System.out.println(dnaSequence1);
System.out.print(space(bestOffset) + bestSequence);
} else {
System.out.print(dnaSequence1+" and "+dnaSequence2+" cannot be aligned");
}
int alignmentScore = dnaSequence1.compareToIgnoreCase(dnaSequence2);
return alignmentScore;
}
public static String space(int bestOffset) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bestOffset; i++) {
builder.append(" ");
}
return builder.toString();
}