C语言实现超帅的shift-and字符串匹配算法

本文介绍如何利用shift-and算法在C语言中进行字符串匹配,详细阐述了算法思路,包括获取母串和模式串、生成辅助表以及循环匹配的过程。通过对每个字符的二进制运算,实现高效匹配,特别适合有相同前后缀的情况。

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

摘要:使用shift-and算法在母字符串“ABCABCADCABD”中找到子串“ABCAD”

一、思路:通过二进制运算暗藏的神奇信息来(超帅的)解决字符串匹配问题

1、得到母串与模式串(子串)

2、生成辅助表;通过模式串(子串)"ABCAD"的信息生成辅助表以此记录子串中各字符的位置信息。,

 

这个对应值的神奇之处:(这部分可以先瞄一眼,等后面计算内容明白了你就会恍然大悟了)

        1、一个值就可以记录一个字符其在串中出现的位置信息,A:01001就可以记录出现了两次的A。当有相同前后缀时可以更快匹配,这部分与kmp算法有异曲同工之妙。

        2、这个值与子串的方向是是相反的,我们后面进行低位到高位的计算——>意味着是对子串字符从左到右进行信息比对。

辅助表
子串(模式串) A B C A D 字符对应值
(模式串反过来的串) D A C B A
A 0 1 0 0 1 01001
B 0 0 0 1 0 00010
C 0 0 1 0 0 00100
D 1 0 0 0 0 10000
key(初始值为0) 0 0 0 0 0 00000


3、进行循环读入字符判断是否匹配

注意:key初始值为0或者为1都是可以实现的,初始值为1的话就与字符判断后移位

        当读取到母串中的字符是子串中没有出现过的字符时,这个字符的对应值为0。

3.1读入母串第1个字符

操作

读入母串中一个字符进行的循环

1、key=(key<<1)+1

(初始key值为0)

key  :00000→00001

读入相应字符并通过查

辅助表得到对应值

  此时读入字符‘A’并查表取值

‘A’   :01001

key  :00001

2、key = key &字符对应值

key  :00001

(匹配情况:A****)

3、判断key是否≥10000(二进制)

Key≥10000则成功匹配模式,可以退出循环了

key: 00001<10000

继续循环

key与字符进行按位与(&)后的含义:(注意,这里的key是指进行&字符值操作后的key值)

依次读入字符后,key判定时的情况(总体情况,可以浏览一下):

3.2读入母串第2个字符

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值