• 下标从0开始的KMP代码


    刚刚笔试完创新工厂,里面考到了KMP,算我幸运,笔试之前才看过了KMP,大体上有一点了解。但是做题的时候还是出了一些问题。

    书上和网上的代码下标都是从1开始的,可是在编程序的时候,大家都习惯从0开始。

    接着,我就自己写了这个下标从0开始的KMP代码

    如果有问题,欢迎大家拍砖。

    #include <iostream>
    #include <string>
    using namespace std;
    
    void get_nextval(const char* T,int nextval[])
    {
    	int i = 0;
    	nextval[0] = -1;
    	int j = -1;
    	while(i < strlen(T) -1 )
    	{
    		if (j == -1 || T[i] == T[j])
    		{
    			i++;
    			j++;
    			if (T[i] != T[j])
    			{
    				nextval[i] = j;
    			}
    			else
    			{
    				nextval[i] = nextval[j];
    			}
    		}
    		else
    		{
    			j = nextval[j];
    		}
    	}
    }
    
    
    int KMP(const char* S, const char *T,int next[])
    {
    	int i = 0;
    	int j = 0;
    	int slen = strlen(S);	//如果下面写成i<strlen(T),如果i是负数,那么i会比stelen的结果大得
    	int tlen = strlen(T);   //这样写是有原因的,大家可以查一查负数和无符号数的比较结果
    	while (i < slen && j < tlen)
    	{
    		if (j == -1 || S[i] == T[j])
    		{
    			i++;
    			j++;
    			if (T[j] == '\0')
    			{
    				return i-j;
    			}
    		}
    		else j = next[j];
    	}
    	return -1;
    }
    
    int next[10];
    int main()
    {
    	string a = "aa";
    	string b = "aa9";
    	get_nextval(b.c_str(),next);
    	cout<<KMP(a.c_str(),b.c_str(),next);
    }
    
    
    
  • 相关阅读:
    c# 执行windows模拟登录
    c#文件压缩解压
    c#文件上传下载功能实现
    .NET core3.1 使用Jwt保护api
    我所理解的闭包
    数组遍历for forEach for..in for..of
    变量提升
    微信小程序做radio,可以拖动进度条
    css:flex
    css常用布局
  • 原文地址:https://www.cnblogs.com/iammatthew/p/1847435.html
Copyright © 2020-2023  润新知