根据阮一峰大大的文章实现,不过没实现“搜索词中的上一次出现位置”(我直接实时查找,显然应该预处理):
文章:http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
代码:
// 偷懒就没使用预处理的方式 int getLastIndex(int patternIndex, string pattern, char inStrChar) { //在pattern中根据index取得在index前=char的index for (int i = patternIndex-1; i >= 0; --i) { if (pattern[i] == inStrChar) { return i; } } return -1; } int BM(string inStr, string pattern) { int lastIndex = pattern.Length - 1; for (int i = lastIndex; i < inStr.Length; ) { for (int k = 0; k < pattern.Length;) { if (inStr[i-k] == pattern[lastIndex-k]) { k++; if (k == lastIndex) { return i; } } else { int move = lastIndex - k - getLastIndex(lastIndex - k, pattern, inStr[i - k]); i += move; break; } } } return -1; }