Exemple #1
0
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;
}