文章目录

  • 前言
  • 今天的主角:字符串
  • 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"))

字符串匹配算法java 字符串匹配算法python_字符串匹配算法java


但是由于是逐个匹配,所以效率是非常低的,特别是模式串匹配的位置在目标串末尾的时候

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))

字符串匹配算法java 字符串匹配算法python_python_02


这个算法很重要,但是也很复杂。所以对于初学者看个人是否愿意去研究吧,反正做蓝桥杯、力扣之类的算法题遇到字符串匹配问题时会经常用到。

3.一些补充的内容,大家可以自己去查查相关的内容

比如字符串大小写转换,正则表达式提取等等这里就不提了,因为这些网上随便搜会有很多博客和网站教你怎么做,其实正则表达式常用的就.*?,然后基本的数字字母怎么匹配,这些掌握就好;对于我来说,正则不常用,用到也是当时去看看使用方法。

结尾

因为各种事情,不可能按时更新博客,而且我也比较情绪化,心情不好的时候更多的愿意去学习做题而不是分享或者写博客,就这样。