首页 > 编程语言 >KMP算法

KMP算法

时间:2023-02-01 20:47:01浏览次数:44  
标签:子串 主串 ch nextval ++ next 算法 KMP

1-从oneNote上搬来

2-代码

String数据结构

//串的堆分配存储结构(malloc占用的是堆空间)
struct HString
{
    char *ch;   //若是非空串,则按串长分配存储区;否则ch为NULL
    int length; //串长度
};
typedef HString String;

2.1 计算next数组(下标从1开始)

//计算next数组
void get_next(String T, int next[])
{
    int i = 1, j = 0;
    next[1] = 0;
    while (i < T.length) // i遍历串中的每个字符(主串)
    {
        if (j == 0 || T.ch[i] == T.ch[j]) //子串第一个元素失配||主串与子串指针处字符相同
        {
            ++i;
            ++j;
            next[i] = j;
            // 1 子串第一个元素失配:主串下标为i的元素next值为1(next[i]=1)
            // 1 第二次进while若还是子串第一个元素失配,则j=next[1]=0
            // 1 第三次进while时执行与第一次进while时相同的操作:next[i]=1
            // 2 主串i与子串j处字符相同:主串下标为i的元素next值为j+1
        }
        else //主串i与子串j处字符失配,且j不为0(j为1时来过渡一下)
            j = next[j];
    }
}

2.2 计算next数组(下标从0开始)

//计算next数组,下标0开始
void get_next_0(String T, int next[])
{
    int i = 0, j = -1;
    next[0] = -1;
    while (i < T.length)
    {
        if (j == -1 || T.ch[i] == T.ch[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}

2.3 计算nextval数组(求next数组优化版)

//计算next数组-优化
void get_nextval(String T, int nextval[])
{
    int i = 1, j = 0;
    nextval[1] = 0;
    while (i < T.length) // i遍历串中的每个字符(主串)
    {
        if (j == 0 || T.ch[i] == T.ch[j]) //子串第一个元素失配||主串与子串指针处字符相同
        {
            ++i;
            ++j;
            if (T.ch[i] != T.ch[j]) // i++,j++后,串与子串指针处字符不相同
                nextval[i] = j;
            else //主串与子串有连续两个字符相等
                nextval[i] = nextval[j];
                }
        else //主串i与子串j处字符失配,且j不为0(j为1时来过渡一下)
            j = nextval[j];
    }
}

 

标签:子串,主串,ch,nextval,++,next,算法,KMP
From: https://www.cnblogs.com/FishSmallWorld/p/17084094.html

相关文章

  • 2023牛客寒假算法基础集训营 5
    2023牛客寒假算法基础集训营5部分题解:ABCDHKLA思路:快排+前缀和+二分查找先从小到大排序,再求出排完序后的前缀和.对于每次询问,二分查找第一个......
  • 代码随想录算法训练营day1
    代码随想录打卡day1今日学习内容(2月1日)阅读数组的基本理论学习二分查找并完成题目学习移除元素并完成题目总结学习到了二分法的两种情况(左闭右闭,左闭右开)......
  • 排序算法之归并排序
    思路:利用递归的方式将数组不停的拆解,直到无法拆分为止。然后将其中的两个数组(拆解后的子数组)进行两两合并成一个有序数组,直到两个子数组合并后就是原数组则结束。 ......
  • LRU和LFU缓存置换算法
    对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内......
  • 二分查找算法实现(图解)与实例
    前言当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫折半查找。 它对要查找的序列有两个要求,一是该序列必须是有序的(即该序列中......
  • 十大经典排序算法
    0、算法概述0.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序......
  • 0_算法的概念以及算法计时
    算法就是计算或解决问题的步骤,算法的运行时间使用解决某个问题使用的“步数”,1步就是计算的基本单位。作为示例,现在我们试着从理论层面求出选择排序的运行时间。......
  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......
  • 广度优先搜索算法 BFS 实战 All In One
    广度优先搜索算法BFS实战AllInOneBreadth-FirstSearch/BFSBFS/广度优先搜索/广度优先遍历/按层次遍历树demosLeetCode"usestrict";/****......
  • 排序算法之希尔排序
    插入排序存在的问题:数组arr={2,3,4,5,6,1},这时需要插入的数是1,那么就要逐个将其他元素往后移,再把1放在首位。当需要插入的数是较小的数时,后移的次数明显增多,对效率很......