python數據結構---5.字符串

前言

今天寫了關於字符串的內容,但是想了一下有些沒太大必要記住的內容就刪掉了,太複雜的我也只是實現一下,具體要理解算法還要自己去畫圖體會。

今天的主角:字符串

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.一些補充的內容,大家可以自己去查查相關的內容

比如字符串大小寫轉換,正則表達式提取等等這裏就不提了,因爲這些網上隨便搜會有很多博客和網站教你怎麼做,其實正則表達式常用的就.*?,然後基本的數字字母怎麼匹配,這些掌握就好;對於我來說,正則不常用,用到也是當時去看看使用方法。

結尾

因爲各種事情,不可能按時更新博客,而且我也比較情緒化,心情不好的時候更多的願意去學習做題而不是分享或者寫博客,就這樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章