前言
今天寫了關於字符串的內容,但是想了一下有些沒太大必要記住的內容就刪掉了,太複雜的我也只是實現一下,具體要理解算法還要自己去畫圖體會。
今天的主角:字符串
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.一些補充的內容,大家可以自己去查查相關的內容
比如字符串大小寫轉換,正則表達式提取等等這裏就不提了,因爲這些網上隨便搜會有很多博客和網站教你怎麼做,其實正則表達式常用的就.*?,然後基本的數字字母怎麼匹配,這些掌握就好;對於我來說,正則不常用,用到也是當時去看看使用方法。
結尾
因爲各種事情,不可能按時更新博客,而且我也比較情緒化,心情不好的時候更多的願意去學習做題而不是分享或者寫博客,就這樣。