美妙的字符串之KMP算法

ぐ巨炮叔叔 提交于 2020-01-19 01:55:20
概述

讲解非常非常详细的KMP算法
在S串中查找P串的位置所在

  1. 暴力算法:S:i, P:j
    若s[i] == p[j],i++,j++;
    若s[i]!=p[j], i = i-(j-1)+1, j = 0;
    之前的已匹配段回溯肯定导致失配,因为p[0]!=p[last(当前不匹配的j位置)-1];

  2. KMP算法:i不回退,只需要移动j。
    1. 对模式串进行处理:next[j]是不匹配时的j下一步回溯位置,取决于当前字符的字符串中有最大长度的相同前缀后缀。
    2. 对模式串P的处理:i从0-plen-1,遍历得到next[], 当某个字符失配时,该字符对应的next值会告诉你下一步匹配中,模式串应该跳到那个位置,如果next[j] = 0或者-1,则跳到模式串的开头字符,若next[j] = k 且k>0,代表下次匹配跳到j之前的某个字符,而不是跳到开头,且具体调过来k个字符。

     	  int next[1000000+100];
     	  void kmp_pre(char x[], int n){
     		int i, j;
     		i= 0;
     		j = next[0] = -1;
     		while(i < n){
     			while(j!=-1 && x[i]!=x[j]) j = next[j];
     			next[++i] = ++j;				
     		}
     	  }
    
int KmpSearch(char *s, char *p){
	int i =0;
	int j = 0;
	int slen = strlen(s);
	int plen = strlen(p);
	while(i < slen && j < plen){
		if(j == -1 || s[i] == p[j]){  i++; j++;}
		else {j = next[j];}
	}
}
if(j == plen) return i-j+1;
else return -1;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!