int n = T.size(), m = P.size(); int i = m - 1; while (i < n) { int k = 0; //已经匹配的字符数 while (P[m - 1 - k] == T[i - k] && k < m) { k++; } if (k == m) return i - m + 1;
// T[i]是与模式不匹配的字符 //如果其不在模式中时,则模式与其下一个位置匹配 //如果在模式中时,移动模式使最右侧的该字符与T[i]对齐 if (table.find(T[i]) == table.end()) i = i + m; else i = i + table[T[i]]; // cout << i << endl; } return-1; }
//返回下标从0开始计数的位置 intBruteForceStringMatch(string t, string p){ int n = t.size(), m = p.size(); for (int i = 0; i <= n - m; i++) { int k = 0; while (k < m && t[k + i] == p[k]) k++; if (k == m) return i; } return-1; }
/* 返回从pos位置开始第一个与P匹配的首字符位置 这里j为1表示字符串第一个字符 j=0表示P的第一个字母与T的当前字母不匹配 查找位置pos为下标序,从0开始 */ voidget_Next(string &P, vector<int> &next); intKMP(string T, string P, int pos){ int n = T.size(), m = P.size(); vector<int> next(m + 1); get_Next(P, next); int i = pos, j = 0; while (i <= n && j <= m) { if (j == 0 || T[i - 1] == P[j - 1]) { i++; j++; } else { j = next[j]; } } if (j > m) return i - j; return-1; } voidget_Next(string &P, vector<int> &next){ next[1] = 0; int i = 1, j = 0; while (i < P.size()) { if (j == 0 || P[j - 1] == P[i - 1]) { i++; j++; next[i] = j; } else j = next[j]; } }
int n = T.size(), m = P.size(); int i = m - 1; while (i < n) { int k = 0; //已经匹配的字符数 while (P[m - 1 - k] == T[i - k] && k < m) { k++; } if (k == m) return i - m + 1;
// T[i]是与模式不匹配的字符 //如果其不在模式中时,则模式与其下一个位置匹配 //如果在模式中时,移动模式使最右侧的该字符与T[i]对齐 if (table.find(T[i]) == table.end()) i = i + m; else i = i + table[T[i]]; // cout << i << endl; } return-1; } intmain(){ string text = "acabaabaabcacaabc", pattern = "abaabc"; cout << BruteForceStringMatch(text, pattern) << endl; cout << KMP(text, pattern, 3) << endl; string P = "BARBER", T = "JIM_SAW_ME_IN_A_BARBERSHOP"; cout << Horspool(T, P) << endl; getchar(); }