浅谈KMP算法

1. 前言

KMP算法用于解决字符串匹配问题,现有两个字符串 S 和 P,请求出字符串 P 在字符串 S 中首次出现的位置,通常 S 被称为文本串,P 被称为模式串. 我们规定字符串的下标从 0 开始,文本串 S 的长度为 n n n,模式串 P 的长度为 m m m. 在下面这个例子中,模式串 P 在 S 中首次出现的位置是 4.

2. 暴力匹配

解决这个问题最直接的方法就是用模式串 P 的开头依次与文本串 S 中的每一个下标对齐,然后判断 S 和 P 的后续字符是否完全相等. 在最差的情况下,算法的复杂度是 O ( n m ) O(nm) O(nm).

暴力匹配的代码如下,我们根据代码来观察具体的匹配过程.

int match(string s,string p){
    int n=s.length();
    int m=p.length();
    int i=0,j=0;
    while(i<n && j<m){
        if(s[i]==p[j]) { ++i;++j; }
        else { i=i-j+1;j=0; }//当前字符不匹配就把p向右平移1位
    }
    return j<m?-1:i-j;//匹配失败返回-1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值