暴力查找算法及KMP算法介绍

KMP算法

我们知道,串类型有一个功能是查找子串,而查找的方法有多种,如暴力查找法、KMP算法,这次我们来介绍一下这些方法

首先说明一下一些符号及名词的含义:

  • S为主串
  • T为待查找的子串,也称为模式串
  • 子串在主串中的位置: 子串在主串中第一次出现时首字母在主串中的索引位置,即子串在主串中的位置。对于主串“to be or not to be ,This is a question”,子串“be”在子串中的位置为3
  • 查找子串,即从主串中查找子串是否存在,如果存在返回子串在主串中的位置
  • 字符串的前缀:对于字符串A和B,若存在A=BS,B、S为任意非空字符串,则称B为A的前缀。如字符串“Pig”,其前缀包括{“P”, “Pi”}
  • 字符串的后缀: 对于字符串A和B,若存在A=SB,B、S为任意非空字符串,则称B为A的后缀,如字符串“Pig”,其后缀包括{“g”, “ig”}
  • i、j 分别代表当前匹配到的主串位置和子串位置
  • 此外,在本文中,数组的索引一律从0开始
暴力查找

暴力查找的步骤为:

if (S[i] == P[j])
{
    i++;j++
}
else
{
    i = i - j + 1;
    j = 0;
}

其文字表述为:

  1. 从主串的首字符开始,与子串的每个字符 逐一进行比较
  2. 若遇到不匹配的字符,则将当前首字符的下一个字符作为首字符
  3. 重复步骤1,步骤2,直到寻找到子串或者扫描完整个主串(其中,i、j表示主串和子串当前比较的位置)

举个栗子:如下图,我们要寻找“ABCE”在“ABCABCDHIJK”中的位置

在这里插入图片描述

  1. S[0] == P[0], 执行i++;j++ ,比较S[1]与P[1]

  2. S[1] == P[1], 执行i++;j++ ,比较S[2]与P[2]

  3. S[2] == P[2], 执行i++;j++ ,比较S[3]与P[3]
    在这里插入图片描述

  4. S[3] != P[3], 执行 i = i - j + 1;j=0; 得到i=1, j=0,重新开始比较;
    在这里插入图片描述

  5. S[1] != P[0],执行 i = i - j + 1;j=0; 得到i=2, j=0,重新开始比较;

  6. S[2] != P[0],执行 i = i - j + 1;j=0; 得到i=3, j=0,重

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值