字符串匹配

          我想了好几天字符串匹配算法.现在市面上卖的有这么几种:

    蛮力:BruteForce; KMP ; BM ; Hospool ; Sunday.

    不加详解,只做点评.

    蛮力:双重for循环,自然朴实,简单雅致.

    KMP:实际上我一直想说一句话:没学计算机专业的人都选错专业了.其实KMP的祖宗是有限状态自动机,每一个句子都对应一个有限状态自动机.现在看到的KMP是化简了的Express版,Professional版是一个二维的next数组,而不是一维的next.当失配的时候,会根据具体字符决定跳转.

     BM,Sunday倒骑毛驴,倒着走比正着走快.比如欧阳锋.

     Sunday效率好,算法简单,KMP弱爆了.但是KMP是一种思想,博大精深,它首先突破了传统的蛮力.

     下面讲一下代码,KMP的GetNext.

   


void getNext(char*p, int *next){
	int i = next[0]=-1, j = 0;
	while (p[j] != 0){
		if (i == -1 || p[j] == p[i]){
			j++; i++;//前进
			next[j] = i;//赋值只在此处发生
		}
		else i = next[i];//i向前回溯
	}
}
/*i 是来来回回漂泊不定,它就是next[]将要等于的值.
   j是单向移动的东西,它是next的下标
   最难理解的是那个if语句
   i==-1表示后无退路了,只得前进
   p[i]==p[j]表示前途无量,一帆风顺,所以前进.
   只有在p[i]!=p[j]并且后面有路可退的时候才能执行else进行回溯.
  */




原文地址:https://www.cnblogs.com/weiyinfu/p/5013908.html