void Match::Getchar(char revChar) { if(!Matched) { char curMachingChar = Key.charAt(curIndex); curIndex = charMatch(revChar, curMachingChar, _IgnoreCase)? curIndex+1 : 0; Matched = (curIndex >= keyLength)? true : false; } }
bool bandedGlobalAlign(const int & k, const string & U, const string & V, vector<int> & L, vector<int> & R, vector<vector<int> > & s, vector<vector<char> > & l, int & NumOfError) { int n = U.size(); int m = V.size(); int d = m >= n ? m - n : n - m; setLR(k, m, n, L, R); for (int i = 0; i <= n; i++) { for (int j = 0; j < R[i] - L[i] + 1; j++) { s[i][j] = 0; l[i][j] = DIAG; } } s[0][0] = 0; for (int j = L[0]; j <= R[0]; j++) { s[0][slCOL(0, j)] = j * w[INDEL]; l[0][slCOL(0, j)] = LEFT; } char maxl; int s1, s2, s3, s1Col, s2Col, s3Col, maxs; for (int i = 1; i <= n; i++) { s[i][0] = i * w[INDEL]; l[i][0] = UP; for (int j = L[i]; j <= R[i]; j++) { s1 = -inf; s2 = -inf; s3 = -inf; s1Col = slCOL(i - 1, j) - 1; s2Col = slCOL(i - 1, j); s3Col = slCOL(i, j) - 1; if (j - 1 >= L[i - 1] && j - 1 <= R[i - 1]) { s1 = s[i - 1][s1Col] + w[charMatch(U[I], V[J])]; } if (j >= L[i - 1] && j <= R[i - 1]) { s2 = s[i - 1][s2Col] + w[INDEL]; } if (j - 1 >= L[i] && j - 1 <= R[i]) { s3 = s[i][s3Col] + w[INDEL]; } max(s1, s2, s3, maxs, maxl); s[i][slCOL(i, j)] = maxs; l[i][slCOL(i, j)] = maxl; } } int nDiff = 0; int p = n, q = m; //rU.clear(); //rV.clear(); while (p >= 0 && q >= 0 && (p + q != 0)) { // trace back from s[n][m] to s[0][0] if (l[p][slCOL(p, q)] == DIAG) { //rU.push_back(U[P]); //rV.push_back(V[Q]); if (U[P] != V[Q]) nDiff++; p = p - 1; q = q - 1; } else if (l[p][slCOL(p, q)] == UP) { //rU.push_back(U[P]); //rV.push_back('-'); p = p - 1; nDiff++; } else if (l[p][slCOL(p, q)] == LEFT) { //rU.push_back('-'); //rV.push_back(V[Q]); q = q - 1; nDiff++; } if (nDiff > d + k) { return false; } } NumOfError = nDiff; return true; }