CSDN|开玩笑呢?学习KMP算法能改变自我认知? | 原力计划( 二 )
本文插图
已知蓝色区域相等且长度都为len , 那么很明显 , next[i] == len , 若此时模式串pattern[i] != pattern[j](两个灰色区域不相等) 。 那么看下图:
本文插图
若此时next[j] == len(粉色部分)那么S1==S2 , 又因为next[i] == next[j] , 所以S1==S3 且 S3 == S4 , 则可以推出S1 == S4 , 这样我们就利用前面所获得的信息 , 推出了S1 == S4这个信息 , 然后将J移动到S1后一格 , 只要再次比较patter[i] 与 patter[j]的相等情况 , 就可以得出next[i+1]的值 。 这里因为i始终向后移动 , 所以也是线性时间复杂度的算法 。ohhhhhhhhh~ 到这里 , 大家就明白了为啥KMP算法的时间复杂度是M+N M+NM+N了 。KMP匹配字符串的完整代码附上!class KMP: def __init__(self, ss: str) -> list: self.length = len(ss) self.next_lst = [0 for _ in range(self.length)] self.next_lst[0] = -1 i = 0 j = -1 while i < self.length - 1: if j == -1 or ss[i] == ss[j]: i += 1 j += 1 self.next_lst[i] = j else: j = self.next_lst[j] self.pattern = ssdef match_str(self, ss:str): ans_lst =j = 0 for i in range(len(ss)): if ss[i] != self.pattern[j]: j = self.next_lst[j] if self.next_lst[j] != -1 else 0 if ss[i] == self.pattern[j]:if j == self.length: return i + 1 - self.length return -1tmp_kmp = KMP('iabc')print(tmp_kmp.match_str('adosjfoiajsoifjasiofjoiasdjoiabc'))版权声明:本文为CSDN博主「落阳学编程」的原创文章 , 遵循CC 4.0 BY-SA版权协议 , 转载请附上原文出处链接及本声明 。原文链接: https://blog.csdn.net/luoyangIT/java/article/details/106041160
你点的每个“在看” , 我都认真当成了喜欢
推荐阅读
- 行业互联网,智慧医疗|商汤科技创“心”升级,探索“联邦学习”入选ECCV
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- 技术编程|机器学习又一重要医学应用!培植人造器官
- 大众新闻|海外高知妈妈都头疼的中文学习,LingoAce有什么好办法?
- 中文|海外高知妈妈都头疼的中文学习,LingoAce有什么好办法?
- 公司|中登集团学习群:公司请你来做什么
- 新机发布|华为Mate40曝光:不开玩笑,这次变化有点大
- CSDN|软件对于英特尔意味着什么?
- 青年|《逻7识智》脑训7:学习
- CSDN|中国首家苹果零售店重开业,苹果CEO库克发文揭幕;“携号转网”服务用户破千万;GitHub 完成北极源代码存档|极客头条
