public static List <TileMatch> GreedyStringTiling(string P, string T, int minLength) { List <TileMatch> tiles = new List <TileMatch>(); int maxMatch = 0; List <int> markP = new List <int>(); List <int> markT = new List <int>(); do { List <TileMatch> matches = new List <TileMatch>(); maxMatch = minLength; for (int i = 0; i < P.Length; i++) { for (int k = 0; k < T.Length; k++) { int j = 0; string m = ""; while (k + j < T.Length && i + j < P.Length && P[i + j] == T[k + j] && markP.IndexOf(i + j) < 0 && markT.IndexOf(k + j) < 0) { m += T[k + j]; j++; } if (j == maxMatch) { TileMatch match = new TileMatch(); match.p = i; match.t = k; match.match = m; matches.Add(match); } else if (j > maxMatch) { matches.Clear(); TileMatch match = new TileMatch(); match.p = i; match.t = k; match.match = m; matches.Add(match); maxMatch = j; } } } foreach (TileMatch m in matches) { bool flag = true; for (int i = 0; i < maxMatch; i++) { if (markP.IndexOf(m.p + i) >= 0 || markT.IndexOf(m.t + i) >= 0) { flag = false; break; } } if (!flag) { continue; } for (int i = 0; i < maxMatch; i++) { markT.Add(m.t + i); markP.Add(m.p + i); } tiles.Add(m); } } while (maxMatch > minLength); return(tiles); }
public static List <TileMatch> SequenceAlignmentMethod(string P, string T) { List <TileMatch> tiles = new List <TileMatch>(); List <List <int> > matrix = new List <List <int> >(); int t = 0; int d = -1, m = 1, g = 2; for (int i = 0; i <= P.Length; i++) { matrix.Add(new List <int>()); matrix[i].Add(0); for (int j = 1; j <= T.Length; j++) { if (i == 0) { matrix[i].Add(0); continue; } int max = 0; int value = matrix[i - 1][j - 1] + (P[i - 1] == T[j - 1] ? m : d); if (value > max) { max = value; } value = matrix[i - 1][j] + g; if (value > max) { max = value; } value = matrix[i][j - 1] + g; if (value > max) { max = value; } matrix[i].Add(max); } } List <TileMatch> p = new List <TileMatch>(); for (int i = P.Length; i >= 0; i--) { int max = 0, k = 0; for (int j = 0; j <= T.Length; j++) { if (matrix[i][j] > max) { max = matrix[i][j]; k = j; } } if (k > max) { k = max; } if ((i != 0 && k != 0 && matrix[i][k] != 0)) { TileMatch match = new TileMatch(); match.match = ""; /*match.p = i; * match.t = k; * p.Add(match); * */ while (i >= 0 && k >= 0) { if (i != 0 && k != 0 && matrix[i][k] != 0) { match.match += P[i - 1]; i--; k--; } else { break; } } match.p = i; match.t = k; tiles.Add(match); continue; } else if (k != 0 && matrix[i][k] == 0) { //p.Add(p[i-1]); continue; } } return(tiles); }