文章目录
- 前言
- 今天的主角:字符串
- 1.最简单的匹配---朴素的字符串匹配
- 2.进阶匹配算法---KMP算法
- 3.一些补充的内容,大家可以自己去查查相关的内容
- 结尾
前言
今天写了关于字符串的内容,但是想了一下有些没太大必要记住的内容就删掉了,太复杂的我也只是实现一下,具体要理解算法还要自己去画图体会。
今天的主角:字符串
python中字符串类型和其他语言基本一样,什么串的长度、串中字符的下标定义也是一样的,所以这方面就不多解释了,今天主要想讲讲字符串的匹配问题。
1.最简单的匹配—朴素的字符串匹配
- 思想:逐个字符比对,如果第一个字符不同就把模式串右移再次比较。直到遍历完字符串
代码实现
def str_matching(t,p):#t是目标串,p是模式串,返回匹配到的字符串起始下标或者未匹配到
i,j=0,0
while(i<len(p) and j<len(t)):
if(p[i]==t[j]):
i,j=i+1,j+1
else:
i,j=0,j-i+1
if i==len(p):
return j-i
return "无匹配子串"
print(str_matching("acccgcccacc","acb"))
print(str_matching("acccgcccacc","accc"))
print(str_matching("acccgcccacc","gccc"))
但是由于是逐个匹配,所以效率是非常低的,特别是模式串匹配的位置在目标串末尾的时候
2.进阶匹配算法—KMP算法
- 思想:这个算法的思想有点复杂,我其实也是看了好久拿着例子画好多遍才突然领悟。
代码实现
def get_pnext(p):
i,k,m=0,-1,len(p)
pnext=[-1]*m
while(i<m-1):
if(k==-1 or p[i]==p[k]):
i,k=i+1,k+1
pnext[i]=k
else:
k=pnext[k]
return pnext
def KMP(t,p,pnext):
i,j=0,0
while(j<len(t) and i<len(p)):
if i==-1 or t[j]==p[i]:
j,i=j+1,i+1
else:
i=pnext[i]
if i==len(p):
return j-i
return "没有匹配的子串"
pnext=get_pnext("acccg")
print(KMP("acccgcccacc","acccg",pnext))
这个算法很重要,但是也很复杂。所以对于初学者看个人是否愿意去研究吧,反正做蓝桥杯、力扣之类的算法题遇到字符串匹配问题时会经常用到。
3.一些补充的内容,大家可以自己去查查相关的内容
比如字符串大小写转换,正则表达式提取等等这里就不提了,因为这些网上随便搜会有很多博客和网站教你怎么做,其实正则表达式常用的就.*?,然后基本的数字字母怎么匹配,这些掌握就好;对于我来说,正则不常用,用到也是当时去看看使用方法。
结尾
因为各种事情,不可能按时更新博客,而且我也比较情绪化,心情不好的时候更多的愿意去学习做题而不是分享或者写博客,就这样。