算法思想參考阮一峯老師的博客:
http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html
//KMP算法
//算法思想參考阮一峯老師的博客
//http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html
#include<string>
#include <vector>
#include <iomanip>
#include <iostream>
//計算模式串的部分匹配值,NEXT數組----------------------------------------------------
void getNext(std::string& sPattern,std::vector<int>& vNext)
{
vNext[0]=0;
for(int i=1;i<sPattern.length();i++)
{
//i:模式串下標
int j=vNext[i-1];//i前一位的對應值
if(sPattern[i]==sPattern[j])
vNext[i]=j+1;//加1
else
vNext[i]=0;//置零
}
}
//KMP算法-----------------------------------------------------------------------------
int KMPAlgorithm(std::string& sText,std::string& sPattern)
{
std::vector<int> vNext(sPattern.size());//模式串的部分匹配值,NEXT數組
getNext(sPattern,vNext);
int pos=0;//記錄位置
while(pos<=sText.length()-sPattern.length())
{
int i=0;
while(sText[pos+i]==sPattern[i] && i<sPattern.length())
i++;//後移
if(sPattern.length()==i)//找到匹配子串
return pos;//返回匹配字串起始位置
else if(0==i)//第一個字符就不匹配
pos++;//右移一位
else
pos=pos+(i-vNext[i-1]);//向右移動若干位
}
return -1;//未找到匹配子串
}
void main()
{
std::string sText = "BBC ABCDAB ABCDABCDABDE"; // 主串
std::string sPattern = "ABCDABD"; // 模式串
int pos=KMPAlgorithm(sText,sPattern);
if(-1==pos)
std::cout <<"未找到匹配子串"<<std::endl;
else
{
std::cout <<"起始位置:"<<pos<<std::endl;
std::cout <<sText<<std::endl;//輸出主串
std::cout <<std::setw(pos+sPattern.length())<<sPattern<<std::endl;//格式輸出模式串
}
system("pause");
}