#include <iostream> #include <string> #include <cstring> using namespace std; //參考文檔 //http://blog.csdn.net/v_july_v/article/details/7041827 /* 註釋: 字符串分爲原始串和模式串 模式串進行匹配時須要計算next數組,計算next數組須要先計算前綴後綴最大公共元素長度,獲得長度數組右移一位 */ bool isSame(const char* pStart,const char* pEnd,int nIndex) { for(int i=0;i<=nIndex;i++) { if(*(pStart + i) != *(pEnd + i)) { return false; } } return true; } int kmpNextArrNode(const char* pstr,int nIndex) { for(int i=0;i<nIndex;i++) { if(isSame(pstr,pstr+nIndex-i,i) == true) { return i+1; } } return 0; } void kmpNextArr(const char* pstr,int nSize,int* pNextArr) { pNextArr[0] = -1; for(int i=0;i<nSize-1;i++) { pNextArr[i+1] = kmpNextArrNode(pstr,i); } } int kmpComput(const char* pstrS,int nSizeS,const char* pstrT,int nSizeT) { //next數組 int* pNextArr = new int[nSizeT]; kmpNextArr(pstrT,nSizeT,pNextArr); //進行匹配 int nIndex = -1; for(int i=0,j=0; i< nSizeS;) { if(pstrS[i] == pstrT[j] || j == -1) { i ++; j ++; } else { j = pNextArr[j]; } if(j == nSizeT) { nIndex = i - nSizeT; break; } } //刪除 delete pNextArr; return nIndex; }