今天重新回顾了 一下之前了解的那个kmp算法。这个算法来自数据结构的字符串的模式匹配;
字符串的模式匹配的最先是 得到一个效率低的传统匹配算法。
int i=0;int j=0;
int l1,int l2;//定义目标的字符串和我们现在的字符串
if(l1<l2) cout<<"匹配无效"<<endl;
while(i<l1&&j<l2)
{
if(t[i]==p[j])
{
i++;j++;
}
else
{
j=i-j+1;
i=0;
}
}
if(j>=l2)
return i-j+1;
这个是最先的一个方法进行字符串的匹配,但是效率低下;
所以又有了 优化
通过字符串的模式匹配的思想,得到一个特征向量。 得到一个next数组。这个求数组的方法不在此介绍
,具体可以参考张铭的数据结构。
接下来详细的分析下kmp 的代码;
首先得到一个优化的next数组
void tonext() //这个数组的内容只与本身的字符串有关,与目标串无关。
{
int j=-1,i=0; //i代表当前字符串的对应的匹配到的位置,j代表了后来的匹配的串
next[0]=-1; //将next数组next【0】=-1;
while(i<m)
{
if(j==-1||xiao[i]==xiao[j]) //当匹配相等或者j 匹配串为第一个的时候
{
i++;j++; //继续匹配
if(xiao[i]==xiao[j]) //若还是相等 ,那么就再次优化next数组,
{
next[i]=next[j];
}
else next[i]=j; //不需要优化,数组的值为 匹配所在的位置
}
else j=next[j]; //如果匹配失败,则给j一个next的值,作为偏移量
}
}
接下来就是 kmp 的具体操作 部分了
int kmp()
{
int i=0,j=0;
while(i<m&&j<n) //n m分别代码目标串的长度和 匹配串的长度
{
if(i==-1||xiao[i]==mo[j]) //当为第一个匹配的时候 或者两个串相等的时候
{
i++;
j++;
}
else i=next[i]; //否则的话 通过next数组来选择跳过i个值
}
if(i>=m) //判断是否匹配完成
{
return j-m+1;
}
else return -1;
}
小小的总结 留待更多的补充、