串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))

本文介绍了KMP算法的基本思想和优化方法,通过next数组避免了主串指针的回溯,提高匹配效率。算法4.6和4.8分别展示了如何计算next数组并实现高效的模式匹配。get_next()和get_nextval()函数用于生成next数组,而Index_KMP()函数用于在主串中查找模式串的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字
符起,检验是否存在子串T。首先令i 等于
pos(i 为S 中当前待比较字符的位序),j 等于
1(j 为T 中当前待比较字符的位序),如果S 的
第i 个字符与T 的第j 个字符相同,则i、j 各
加1 继续比较,直至T 的最后一个字符(找
到)。如果还没到T 的最后一个字符,比较就
出现了不同(没找到),则令i 等于pos+1,j 等
于1,由pos 的下一个位置起,继续查找是否
存在子串T。这个过程如图410 所示。

在算法4.5 中,主串S 的指针i 总要回溯,特别是在如图410 所示的有较多字符匹
配而又不完全匹配的情况下,回溯得更多。这时,主串S 的一个字符要进行多次比较,显
然效率较低。
如果能使主串S 的指针i 不回溯,在有些情况下效率则会大为提高。这是可以做到
的,因为主串S 中位于i-1,i-2,⋯ 的字符恰和子串T 中位于j-1,j-2,⋯ 的字符相
等,如图410 所示。仍以图410 为例,当S 和T 在第i(终值)个字符处字符不相符
时,i 仍保持在终值处不动,j 回溯到第1 个字符与i 的当前字符继续进行比较。j 回溯到第
几个字符是由子串T 的模式决定的。算法4.7 根据子串T 生成的next 数组指示j 回溯到第
几个字符。next 数组的意义是这样的:如果next[j]=k,当子串T 的第j 个字符与主串S 的
第i 个字符“失配”时,S 的第i 个字符继续与T 的第k 个字符进行比较,T 的第k 个字符
之前的那些字符均与S 的第i 个字符之前的字符匹配。以教科书中图4.5 为例,设子串T
为“abaabcac”。当T 的第5 个字符与S 的第i 个字符失配时,S 的第i-1 个字符一定是a,
和T 的第4 个字符相等。它和T 的第1 个字
符相等。这样,S 的第i 个字符和T 的第2 个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值