问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构 字符串 模式匹配问题 KMP算法

发布网友 发布时间:2022-04-25 03:17

我来回答

3个回答

懂视网 时间:2022-04-18 18:45


首先,KMP算法使字符串匹配中的优化算法,使原来的O(m*n)降到了O(m+n)

关于他的理解,我推荐先看视频,他讲的很清楚了。汪都能听懂的KMP字符串匹配算法
然后从可视化方面理解,推荐看看如何更好的理解和掌握 KMP 算法? - 佑子的回答 - 知乎容
最后从代码层理解Searching for Patterns | Set 2 (KMP Algorithm)
代码不要看太多别人的,我感觉好多人写的也有问题,我在自己运行处问题时,有看有些同学写的,被带到其他坑里了。。。
最后记录代码

'''
先求next数组
'''def next_list(pattern):
 next=[]
 pattern_list=list(pattern)
 j=0
 i=1
 for s in range(len(pattern)): #第一位一直是0
 if s==0:
  next.append(0) #看第i个和第j个字母是否相同,如果相同,则累加
 #同时i,j同时右移
 elif(pattern_list[i]==pattern_list[j]):  
  next.append(j+1)
  j+=1
  i+=1
 #如果不相同,则next为0,同时j也退回第一个位置,i继续前进一个位置
 else:
  next.append(0)
  j=0
  i=s+1
 print(next) return next

next_list('ABABCABAB') 

def kmp(text,pattern):
 #text的位置
 i=0
 #pattern的位置
 j=0
 next=next_list(pattern) if(not(text and pattern)):
 print('字符串为空,请输入字符串') elif(len(text)<len(pattern)):
 print('原字符串过小') elif(text==pattern):
 print('字符串一致') else: while( (i<len(text) )):
  print((text[i],pattern[j]))
  print(i,j)  #如果相同,则进行下一个对比
  if( text[i]==pattern[j]):
  i+=1
  j+=1
  #判断是不是匹配完了
  if j==len(pattern):
  print('从第{0}个位置开始匹配'.format(i-j))
  j=next[j-1]  #如果不匹配,则j反回到前一个字母对应的next
  elif i<len(text) and text[i]!=pattern[j]:  #我就是少了这个判断,一直有问题,就是在不匹配后的第二步,后面这个很关键
  if j!=0:  #这个就是精髓了,如果不匹配,就去找第一个和这个匹配的字符串,然后在这个前面的匹配字符串
  #的后一个字母拿出来,再与长text比较的第i个字母比较
   j=next[j-1]  #如果j已经回到了0,则通过增加i,text移动到下一个字母
  else:
   i+=1# text = "ABABDABACDABABCABAB"# pattern = "ABABCABAB"  text='abxabcabcaby'pattern='abcaby'kmp(text,pattern)#output:next=[0, 0, 0, 1, 2, 0]


('a', 'a')
0 0
('b', 'b')
1 1
('x', 'a')
2 0
('a', 'a')
3 0
('b', 'b')
4 1
('c', 'c')
5 2
('a', 'a')
6 3
('b', 'b')
7 4
('c', 'c')
8 2
('a', 'a')
9 3
('b', 'b')
10 4
('y', 'y')
11 5
从第6个位置开始匹配

相关推荐:

KMP算法中最难理解的地方的理解

热心网友 时间:2022-04-18 15:53

你的程序本身思路没有错,但错在以下几点:
1.在程序中有字符串S和T,你用S[0]代表字符串的长度,但S是字符串,S[0]是长度吗?
2.在main函数中,你输入的S和T都是用gets(S)或gets(T),那么它们都是以下标0开头的,你应该要进行处理,使它以下标1作为开头(可以这样gets(&S[1]); 然后S[0] = strlen(&S[1]) + '0';在用S[0]作为长度的时候,把它从字符变成数字就行了)。

热心网友 时间:2022-04-18 17:11

wqewqeqwr3r43wr追问来混财富值么???童鞋。。。我用追问赏给你。。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 串的模式匹配 什么是字符串多模式匹配和字符串多模式匹配?算法又如何? 模式匹配的概念 Java编程实现字符串的模式匹配 字符串的模式匹配算法 魔兽世界3.13版本的用荣誉换S2武器NPC在哪? 去北京八达岭长城从西直门坐S2的话,在哪 燃烧的远征s2在哪换 魔兽世界S2武器在那里换多 ? 魔兽世界s2在加基森哪换 S1,S2,S3分别在哪买? 魔兽世界竞技场装备S2在哪换 魔兽世界S2在哪换 wows2在哪换 现在魔兽的S2在哪买 WOW中的S2在哪可以看到? 乐清轻轨s2虹桥站设在哪里 电动汽车s2开关在哪 魔兽世界法师的S2在哪换? 即将开通的S2线在昌平设站,具体昌平什么位置呀? 字符串匹配(常规方法) 字符串的模式匹配实现的什么功能? 为什么字符串模式匹配不行?运行可以,结果是一直输出是-1. C语言(数据结构)字符串的模式匹配程序求改错!~~!!~ 在Word编辑中,模式匹配查找中能使用的通配符是? 字符串匹配的介绍 字符串的匹配功能是什么意思 数据结构(c++)字符串 模式匹配算法问题,对高手来说只要写一点点_百度... 如何使用IPTables实现字符串模式匹配 几种单字符串模式匹配算法的简介,C/C++实现及性能对比 怎么敲python 模式匹配问题。设模式字符串只含有英文字母、数字字符、问号“? patsubst:模式字符串替换 我想问下什么是模式字符串啊??这是一道linux的知识。 脚本里面如何比较字符串的匹配模式 21、下列哪些字符串匹配模式”。boy&#92;&#92;w[3]”( )。 A、boy111 B、boy!@# C、boyweo D、boyboyboyboy 2021年天狼最新电视剧排行是什么? 20216月14王者荣耀苹果系统天狼系列皮肤为什么没有返场? 2021年的火星? 2021年四美皮肤上线顺序是什么? 2021天狼影视好看的古装剧有哪些? 为什么这么多企业参加2021年GHRC 天狼星评选?