樸素的串匹配演算法
評價:簡單易懂,但效率低下。演算法時間複雜度o(m*n)
樸素演算法的執行過程,設目標串 t: ababcabcacbab,模式串 p: abcac
樸素的串匹配演算法
'''def *****_matching(t,p):
m,n = len(p),len(t)
i,j = 0,0
while i < m and j < n:
if p[i] == t[j]:
i,j = i+1,j+1
else:
i,j = 0,j-i+1
if i == m:
return j-i
return -1
'''時間複雜度: o(m*n)
缺陷:可能出現回溯,匹配中遇到一對字串不同時,模式串p將右移乙個字串位置,隨後的匹配
回到模式串的開始(重置j=0)
'''無回溯串匹配演算法(kmp演算法)解讀:關鍵在於充分利用了模式串中的資訊。
在 pi 匹配失敗時,所有 pk(0 ≤ k< i)都已匹配成功(否則 不會考慮 pi 的匹配)。也就是說: tj 之前的 i-1 個字元就是 p 的前 i-1 個字元 。原本應該根據 t 的情況確定前移方式,但實際上可以根據 p 本身的情況確定,可以通過對模式串本身的分析在匹配之前做好 。
結論:對 p 中的每個 i,有乙個唯一確定的 ki,與被匹配的串無關。通 過對模式串 p 的預分析,可以得到每個 i 對應的 ki 值
#pnext表構造方法
def gen_pnext(p):
'''生成針對p中各位置i的下乙個檢查位置表,用於kmp演算法'''
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
pnext=gen_pnext('abbcabcaabbcaa')
#kmp演算法
def matching_kmp(t,p,pnext):
'''kmp串匹配,主函式'''
OC 第四章 字串
第四章 字串 oc字串 unichar unicode碼 組成 c語言 ascii碼 不可變字串 nsstring 自身的長度以及內容都是不可變的 1.建立字串的五種方式 2.字串的常用方法 nsstring str4 str substringwithrange range 4.字串的拼接 5.判...
第四章 字串和字元
字串是由多個字元構成的序列,比如 hello,world 或者 albatross swift用string型別代表字串,而string又代表乙個character型別的集合。swift的string和character型別提供一種快速的,符合unicode標準的方式來處理 中的文字。字串建立和操作...
第四章 字串與陣列
字串 定義 var list welcome to the westworld 字串長度 list.length 獲得指定位置的字元 list.charat n n是角標 獲取字串首次出現位置 list.indexof n 根據位置提取一段子串 list.slice num1,num2 字串分割成陣...