字串匹配演算法

2021-10-04 12:33:34 字數 2246 閱讀 4224

乙個有限狀態機包含3部分:

有限的狀態集合,其中包含初始狀態、中間狀態和接受狀態(或者叫做終止狀態)

有限的輸入字母表

狀態轉移函式

乙個簡單的兩狀態自動機如下:

狀態集合為 其中0是初始狀態,也是中間狀態,1是接受狀態

輸入表為

狀態轉移函式表示為狀態轉移表如下:

狀態輸入a

輸入b010

100等價的狀態轉移圖為:

此狀態機可以接受最後具有奇數個a的字元的字串,比如a,abaaa,而aa、abbaa等不會接受。

考慮匹配模式p=ababaca,對此可以建立的狀態機如下:

狀態集合 其中0是初始狀態,也是中間狀態,7是接受狀態,其他的為中間狀態。這裡狀態採用數字表示,且接受狀態恰好為模式的長度,實際上狀態也可用其他形式表示。

輸入集合

狀態轉移函式用等價的狀態轉移表表示:

狀態輸入a

輸入b輸入c01

\color

100112

\color

2023

\color

300314

\color

4045

\color

500514

6

\color

667

\color

700712

0紅色數字表示乙個正確的匹配,即從初始狀態0開始,依次讀入a b a b a c a。

以狀態5為例,下面解釋分別讀入a b c後要轉入的下個狀態。

狀態5說明已經匹配了ababa,讀入c,則變為ababac,轉狀態6;

讀入a,

字首ababaa

不是p的字首

babaa

不是p的字首

abaa

不是p的字首

baa不是p的字首

aa不是p的字首

a是p的字首

因此讀入a,狀態轉1.

讀入b,

字首ababab

不是p的字首

babab

不是p的字首

abab

是p的字首

因此讀入b,狀態轉4.

所以當讀入新的輸入時,要轉移的狀態為匹配p的最長字首表示的狀態。

因此採用有限狀態機匹配字串的流程為:

根據模式構建有限狀態機,即初始化狀態轉移表

依次讀入每個字元,根據狀態轉移表決定下個狀態,當狀態為接受狀態時,表示找到乙個合適的匹配。

**工作主要為初始化狀態機,非常適合p固定,而要匹配的字串n較大的情況,此時時間複雜度為o(n),p較短且輸入集合較小時可以忽略建立自動機的損耗。

package main

import (

"fmt"

"sort"

"strings"

)func main()

type (

state int

char byte

charslice char

)func (c charslice) len() int

func (c charslice) swap(i, j int)

func (c charslice) less(i, j int) bool

func createstatetransfertable(pattern string) map[state]map[char]state

alphas := make(charslice, 0, len(alphasm))

for char, _ := range alphasm

sort.sort(alphas)

fmt.println(alphas)

ret := make(map[state]map[char]state)

for s := 0; s <= len(pattern); s++ )

pre := prefix

k := s + 1

for k > 0 && !strings.hasprefix(pattern, pre)

trans[c] = state(k)

} ret[state(s)] = trans

} return ret

}

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...