字串匹配的演算法在很多領域都有重要的應用,這就不多說了。
我們考慮一下演算法的基本的描述:給定大小為
σ字母表
σ上的長度為
n的文字
t和長度為
m的模式
p,找出
t中所有的
p的出現的地方。
乙個長度為m的串
p表示為乙個陣列
p[0...m-1]
,這裡m≥0
。當然,
m=0時,表示空串,用
ε表示。p的第
i+1個字元用
p[i]
表示,這裡
0≤i。類似,
p[i...j]表示p
的子串,第
i+1個字元到
j+1個字元。
0≤i≤j。如果i>
j,p[i...j]=ε
。p[i...j]=p[max(i,0), min(j,m-1)]
。字串有個連線操作,就是把兩個字串串成乙個大的字串,精確的定義如下:假設
u是乙個長度為
n的字串,表示為
u[0...n-1],v
是乙個長度為
m的字串,表示為
v[0...m-1],u
和v的連線uv
是乙個新的字串,長度為
n+m。設這個新字串為
w,那麼有
u[0...n-1]=w[0...n-1]
,v[0...m-1]=w[n...n+m-1]
。事先申明一下,下面提到的詞,字首,字尾,子串,邊界,週期等實際上都是字串,只不過是側重點不同罷了。
字首(prefix
):如果存在乙個詞(
word)v
,滿足uv = w
,則稱u是w
的字首;
字尾(suffix
):如果存在乙個詞
v,滿足
uv = w
,則稱v是w
的字尾;
注意到u,v
都可能是
ε,因此w既是
w的字首,也是
w的字尾。
子串(substring
)或者因子(
factor
)如果存在兩個詞u,
v,滿足uzv = w
,則稱z是w
的子串或者因子;乙個子串
u如果既是
p的字首,也是
p的字尾,則稱為
p的邊界(
border
)。週期(
periodic)對於i,0
i有w[i]=w[i+p]
,則稱p是w
的週期,最小的週期記為
per(
w)。乙個詞
w稱為基本的(
basic
)如果它不能寫成另乙個詞的冪:即不存在詞
z和整數k滿足
w=z^k
。乙個串
p的逆(
reverse
)記成p
,是把p
的字母從最後乙個開始,到第乙個依次連線起來,如果串為
p[0...m-1]
,則它的逆為
p[m-1]p[m-2]...p[1]p[0]
。suff(p)
表示串p
的字首的集合。
fact(p)為p
的因子的集合。
對於文字
t和模式
p,如果
p[0]
對齊t[s]
,p[1]
對齊t[s+1]
,...
,p[i]
對齊t[s+i]
,對於i=0,...,m-1
,那我們說p在
t中位移為
s。這時子串
t[s...s+m-1]
叫做文字的當前視窗。如果
t[s...s+m-1]=p
,我們說位移
s是有效的。那麼顯然字串匹配的問題就可以表述為在文字
t中找到
p的所有有效位移。
大部分的字串匹配演算法工作的方法如下。首先通過乙個大小為
m的視窗來掃瞄文字
t。對於每個視窗,檢查是否與模式
p相等(可以通過依次比較視窗和
p的每個字元是否相等來判斷,或者其他什麼方法)。如果視窗和
p相同,或者不匹配,那麼向右移動視窗到下乙個特定位置繼續比較。每次比較叫做一次
attempt
。這種機制通常叫做滑動視窗機制。視窗最初的位置為
0(在字串的最左邊),然後向右滑動視窗,直到視窗超出了文字的最右邊的邊界為止。
一般有三種基本的搜尋方法。
字首搜尋
:在搜尋視窗內從前向後(沿著文字的正向)逐個讀入文字字元,查詢視窗中的文字和模式串的最長公共字首,如
kmp演算法。
字尾搜尋:在搜尋視窗內從後向前(沿著文字的反向)逐個讀入文字字元,查詢視窗中的文字和模式串的最長公共字尾,如
boyer-moore
演算法。
子串搜尋:在搜尋視窗內從後向前(沿著文字的反向)逐個讀入文字字元,搜尋滿足如下條件的最長字串u:
u既是視窗文字的字尾,也是模式的子串,如
karp-rabin
演算法。
python基本概念 字串
1 字串 乙個字串用什麼引號開頭,就必須用什麼引號結尾。兩上三引號之間的一切都作為字串的內容,對應的單引號與雙引號卻只能建立單行字串。2 轉義符 行末的單獨乙個反斜槓表示字串在下一行繼續,而不是開始乙個新的行。3 自然字串 如果你想要指示某些不需要如轉義符那樣的特別處理的字串,那麼你需要指定乙個自然...
字串基本概念 譚浩強 cpp
字串處理函式 include或者 include 字串複製函式strcpy 可以實現將乙個字串賦給乙個字元陣列,但是不能用賦值語句將乙個字串常量或字元陣列直接賦給乙個字元陣列。字串比較函式 strcmp 注意 對兩個字串比較,不能用以下形式 if str1 str2 cout yes 字元陣列名st...
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...