KMP算法详解(理论+C语言代码实现)(下)

简介: KMP算法详解(理论+C语言代码实现)(下)

三:next数组特点的证明

四:next数组的优化:nextval数组

五.next数组C语言代码实现

/*
str:代表主串
sub:代表字串
pos:代表从主串的pos位置开始找
*/
void GetNext(char* sub, int* next,int lenSub)
{
  next[0] = -1;
  //子串长度为1,直接返回即可
  if (lenSub == 1)
  {
    return;
  }
  next[1] = 0;
  int i = 2;//当前i下标
  //因为此时还不知道next[i]的值,只知道next[i-1]的值和sub[k]的值
  int k = 0;//前一项的k
  while(i<lenSub)
  {
    //k==-1,此时不能再进行回退了,否则子串会发生越界
    //匹配成功或者k回退到k=-1时,利用next[i-1]=k,推出=>>next[i]=k+1;
    //i和k往后走,继续求解next数组
    if (k==-1 || sub[i - 1] == sub[k])
    {
      next[i] = k + 1;
      i++;
      k++;
    }
    //sub[i-1]!=sub[k],即匹配不成功,k回退
    else
    {
      k = next[k];//k回退
    }
  }
}
int KMP(const char* str,const char* sub, int pos)
{
  //对参数的正确性的判断
  assert(str!=NULL && sub!=NULL);
  int lenStr = strlen(str);
  int lenSub = strlen(sub);
  if (lenStr == 0 || lenSub == 0)
  {
    return -1;
  }
  if (pos < 0 || pos >= lenStr)
  {
    return -1;
  }
  int* next = (int*)malloc(sizeof(int) * lenSub);
  assert(next != NULL);
  GetNext(sub, next, lenSub);
  //开始遍历两个串
  int i = pos;//遍历主串
  int j = 0;//遍历子串
  while (i < lenStr && j < lenSub)
  {
    //对应位置相等,往后走
    //j==-1,此时不能再进行回退了,否则子串会发生越界
    if (j == -1 || str[i] == sub[j])
    {
      i++;
      j++;
    }
    //否则:i不动,j回退
    else
    {
      j = next[j];
    }
  }
  //子串遍历结束,意味着匹配成功
  free(next);
  next = NULL;
  if (j >= lenSub)
  {
    return i - j;
  }
  //主串遍历成功,子串却没有遍历成功,意味着匹配失败
  return -1;
}
//验证
int main()
{
  printf("%d\n", KMP("ababcabcdabcde", "abcd", 0));//5
  printf("%d\n", KMP("ababcabcdabcde", "abcdf", 0));//-1
  printf("%d\n", KMP("ababcabcdabcde", "e", 0));//13
  printf("%d\n", KMP("d", "e", 0));//-1
}
//验证成功

以上就是KMP算法的详解,希望能对大家有所帮助!

相关文章
|
4月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
464 0
|
5月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
279 26
|
5月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
214 6
|
5月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
166 0
|
4月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
237 8
|
4月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
275 8
|
5月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
1399 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
5月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
330 14
|
5月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
385 2
|
5月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
187 1

热门文章

最新文章