0001 int match(char* T, int n, char* P, int m) { //Boyer-Moore算法 0002 int i = m-1, j = m-1; //当前字符位置 0003 int* bc = new int[128]; int* gs = new int[m]; 0004 buildBC(P, m, bc); buildGS(P, m, gs); //兼顾BC策略和GS策略 0005 while ((0 <= j) && (i-j <= n-m)) //自后向前逐个比对字符 0006 if (T[i] == P[j]) //若匹配,则转到前一对字符 0007 { i--; j--; } 0008 else //否则借助GS表与BC表快速右移 0009 { i += m-1 - min(bc[T[i]], j-gs[j]); j = m-1; } 0010 delete[] gs; delete[] bc; return i-j; //销毁GS表和BC表,返回最终的对齐位置 0011 } //BM: BC+GS