前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构(4) - 串

数据结构(4) - 串

作者头像
惊羽-布壳儿
发布2022-06-15 21:29:18
1570
发布2022-06-15 21:29:18
举报
文章被收录于专栏:惊羽-布壳儿

1. 连续排列的字符

1.串的模式匹配(KMP算法匹配查找)

1.举例
代码语言:javascript
复制
需求 : 在总串S中,查找子串T,若存在,返回子串首字母在总串的索引i.

(1) 暴力查找
    从总串(简称S)的第一个字符S1开始,与子串(简称T)首字母开始比对,S1,S2..,T1,T2...,若相等,返回
    S1,以此类推从S2一直比对到S[s.length-T.length];
    
    分析: 效率低,指针i回溯次数多.
 
(2) KMP查找
    从S[i]开始匹配,T假设从1开始,若一直到T[j]发现出现了不匹配(部分匹配),计算T[j]的next值
    ,然后将T串向右滑动T[j].nextValue位,再次进行比对.若T[j].next=0;则i指针向右移动一位.
    
    分析: 查找效率增大,i指针不回溯;
    
    思想 : 其实,next值得计算是寻找部分匹配子串的中心对称中心,这样的话,在发生不匹配的时候,
    将子串向右滑动nextValue的长度,显然前面还是匹配的,后面再用程序进行判断进行比对就可以了
    i指针并不需要回溯.
    
(3) KMP算法的优化
    可以记录S[i]的值,当滑动完成后,T[nextValue] 的值与S[i]的值相比较,这样就可以先一步判断
    有无向下比对的必要,节省一步操作.

计算 String[] t = {"a","b","a","b","b","c","b","a","b"} 的next数组

    ababbcbab
    
    当在t[0]处不匹配时,t串没有必要向右在滑动了,所以此时S串的指针i向右滑动一位;所以,模式串的
    首位字符的next值一定是0;
    
    在t[1] 处时,中心对称字符是不存在的,所以向右移动一位就可以了,所以,模式串的第二位字符的
    next值一定是1;
    
    在t[j] 时,(j>2)寻找t[0]--->t[j-1] 子串的中心对称点,这样的话,我们将t串向右滑动到中心
    对称点的位置,这个时候,前面已经不需要再比对了,(因为中心对称保证了数据的一致性),再从S[i]
    节点开始比对就可以了.
    
    所以 :
    nextT[] = {0,1,2,1,1,1...}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
    • 1. 连续排列的字符
      • 1.串的模式匹配(KMP算法匹配查找)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档