zoukankan      html  css  js  c++  java
  • kmp算法笔记

    https://blog.csdn.net/v_july_v/article/details/7041827#comments

    链接讲得很详细,画几个重点方便以后忘了捡

    • next[]数组从第i位递推算出第i+1位,所以遍历s[0,len-2]即可

    • next[i]计算的是s[0,i-1]的最长公共前后缀长度,失配时,模式串向右移动的位数为:已匹配字符数 - 失配字符的上一位字符所对应的最大长度值,即j-nt[j]

    • 关于计算next[],假如s[k]s[j],next[j+1]=next[j]+1=k+1,否则k=next[k],直到s[k]s[j]或者k==-1,即一直移动前面k的值就行

    • kmp找模式串在文本串的位置

    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)
    	{
    		//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++    
    		if (j == -1 || s[i] == p[j])
    		{
    			i++;
    			j++;
    		}
    		else
    		{
    			//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]    
    			//next[j]即为j所对应的next值      
    			j = next[j];
    		}
    	}
    	if (j == pLen)
    		return i - j;
    	else
    		return -1;
    }
    
    • next数组的生成,递推求
    void GetNext(char* p,int next[])
    {
    	int pLen = strlen(p);
    	next[0] = -1;
    	int k = -1;
    	int j = 0;
    	while (j < pLen - 1)
    	{
    		//p[k]表示前缀,p[j]表示后缀
    		if (k == -1 || p[j] == p[k]) 
    		{
    			++k;
    			++j;
    			next[j] = k;
    		}
    		else 
    		{
    			k = next[k];
    		}
    	}
    }
    
    • 求优化的next数组
    //优化过后的next 数组求法
    void GetNextval(char* p, int next[])
    {
    	int pLen = strlen(p);
    	next[0] = -1;
    	int k = -1;
    	int j = 0;
    	while (j < pLen - 1)
    	{
    		//p[k]表示前缀,p[j]表示后缀  
    		if (k == -1 || p[j] == p[k])
    		{
    			++j;
    			++k;
    			//较之前next数组求法,改动在下面4行
    			if (p[j] != p[k])
    				next[j] = k;   //之前只有这一行
    			else
    				//因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]
    				next[j] = next[k];
    		}
    		else
    		{
    			k = next[k];
    		}
    	}
    }
    
  • 相关阅读:
    两个jquery编写插件实例
    jquery编写插件(转)
    前后端分离
    理解流式布局
    元素外边距溢出(塌陷)
    超级有用的9个PHP代码片段
    php实现redis锁机制
    php程序守护进程
    SESSION机制
    php面试
  • 原文地址:https://www.cnblogs.com/VIrtu0s0/p/10529598.html
Copyright © 2011-2022 走看看