习惯了凌晨来敲那些复杂的代码
因为安静
因为此时的心里才被代码完全的占据,没有一丝的杂念
搞了两天多的递归,终于出结果了,
终于没把自己仍死循环里,否则还不知道谁来break out me呢!
----------------------------------------------------以下问题描述及解决方案---------------------------------------------
Q = catgt
S= acgctg
由Query和Subject所得的得分矩阵为:
1、
初始化得分矩阵的条件:
Matrix(0,0) = 0; ( 矩阵(0,0)这个点,初始化为0 )
Matrix(0,j) = match(-,y)+ Matrix(0,j-1) (j>=1)
Matrix(i,0) = match(x,-)+ Matrix(i-1,0) (i>=1)
Matrix(i-1,j-1) + match(Q[i], S[j]);
Matrix(i,j) = max Matrix(i-1,j) + match(Q[i], -);
Matrix(i,j-1) + match(-, S[j]);
2、
match(x,x) = 2 (两个字符相匹配得2分)
match(x,y) = match(x,-) = match(-,y) = -1 (两个字符不匹配或与空格匹配得-1分)
由以上条件,得到的得分矩阵为:
|
- |
c |
a |
t |
g |
t |
- |
0 |
-1 |
-2 |
-3 |
-4 |
-5 |
a |
-1 |
-1 |
1 |
0 |
-1 |
-2 |
c |
-2 |
1 |
0 |
0 |
-1 |
-2 |
g |
-3 |
0 |
0 |
-1 |
2 |
1 |
c |
-4 |
-1 |
-1 |
-1 |
1 |
1 |
t |
-5 |
-2 |
-2 |
1 |
0 |
3 |
g |
6 |
-3 |
-3 |
0 |
3 |
2 |
回溯思想:
backTrace():
for( i=Q.length, j=S.length; i>0&&j>0; ) {
if ( Matrix(i,j) == Matrix(i-1,j-1) + match(Q[i], S[j]) ){
i--; j--;
}
else if ( Matrix(i,j) == Matrix(i-1,j) + match(Q[i], -) ){
i--;
//在Q序列中的j位置插入一个空格 ‘-’
}
else if( Matrix(i,j) == Matrix(i,j-1) + match(-, S[j]) ){
j--;
//在S序列中的i位置插入一个空格 ‘-’
}
}
问题:需要把标红色箭头的三条路径都选出来。
如下图所示:
所得结果为:
q = catg-t- q = -c-atgt q = -ca-tgt
s = -acgctg s = acgctg- s = acgctg-
debug的结果为:(这张图是这几天见到过的最漂亮的东西了,哈哈哈)