高效面试之字符串匹配(KMP,AC算法)

本文介绍了字符串匹配中的KMP算法和AC自动机。KMP算法通过构造next数组避免不必要的回溯,提高匹配效率。AC自动机利用广度优先搜索构建失败指针,实现O(n)时间复杂度的匹配,总时间复杂度为O(M+n),其中M为模式串长度总和。
摘要由CSDN通过智能技术生成
文本Tn  模式Pm, P在T中出现的位置为偏移
字符串匹配问题描述为:找出所有偏移s(0=<s<=n-m),使得P为Ts+m的后缀。
分两步完成,预处理+匹配

算法
预处理时间
匹配时间
朴素算法
o
O((n-m+1)m)
RK算法
O(m)
O((n-m+1)m)
有限状态机
O(m|∑|)
O(n)
KMP
O(m)
O(n)
1.朴素字符串模式
for s=0 to n-m
    ifP[1...m]==T[s+1...s+m]
    print "找到偏移S"


2.KMP
难点:求带匹配的串的前缀next数组




特点:

它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,避免不必要的回溯,加快匹配速度。

1.next数组

next数组是用来说明待匹配的串的对称性,最大公共前后缀 

         a b c d a b d

next: 0 0 0 0 1 2 0

字串a的最大公共前后缀为0,a b c d a 最大公共前后缀为ab,长度为2
优化版:
  1. void get_next(char str[], int n,int next[])  
  2. {  
  3.     int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值