資料結構 串

2021-07-23 10:12:03 字數 1989 閱讀 6289

串名、串值、串長、空串、空格串。

字串的比較

字串模式匹配演算法:

1. 簡單字串模式匹配演算法

最簡單實現是用字串p的字元依次與字串t中的字元進行比較。實現思想是,首先將子串p從第0個字元起與主串t的第pos個字元起依次比較對應字元,如全部對應相等,則表明已找到匹配,成功終止。否則將子串p從第0個子串起與主串t的第pos+1個字元起依次比較字元。如此進行,直到某次成功匹配。或某次t中無足夠的剩餘字元與p中個字元匹配失敗為止。

2. 首尾字串模式匹配演算法

為了避免在每趟匹配的最後乙個字元時才發現不能匹配,可採用從模式串的兩頭分別比較的方法,先比較模式串的第0個字元,再比較模式串的最後乙個字元,然後才依次比較第乙個到第n個。

3. kmp字串模式匹配演算法

上述兩種演算法效率低,原因是執行過程有回溯。

在普通的字串模式匹配演算法上,當遇到主串和模式串的字元不能匹配成功時,不論已經匹配了多少字元都要進行指標回溯,再開始下一輪的匹配。這樣效率是十分的低下的。kmp演算法,是在樸素的模式匹配演算法的基礎上,實現了匹配不成功時,不對主串指標進行回溯,使模式匹配的時間複雜度降低為:o(n + m)。

kmp演算法的核心思想是,在s[i] 和 p[j]不匹配時,不對主串進行指標回溯,而是在模式串中p中尋找k,用s[i] 和 p[k]進行下一輪的匹配。

在這裡,將主串 s 和模式串 p 都看成是一條直線,故而在s[i] 和 p[j] 匹配不成共時,有如下情形:

圖1 s[i] 和 p[j] 匹配不成功

即是:p[1…j-1] == s[i-j+1,…,i-1].

p[1,..,k-1] == s[i-k+1, … , i-1] .

將模式串和主串都看著一條直線,那麼就有下圖:

圖2  使用p[k]和s[i]進行下一輪匹配

由於 1<= k < j-1,那麼將兩圖合併起來會有什麼效果呢?

就是說,當s[i] 和 p[j] 匹配不成功時,最對主串不進行指標回溯,而是用p[k]和s[i]進行匹配時,k必須滿足以下條件:

p[1,…,k-1] == p[j-k+1, … , j-1]。

kmp演算法的是對匹配的模式匹配演算法的改進,在s[i]和p[j]匹配不成功時,不是對主串進行指標的回溯,而是在p[1,…,j-1]中,尋找乙個p[k],

用s[i]和p[k]進行下一輪的匹配。其實現的最大問題就是如何的根據p[1,…,j-1]來求出p[k]。

在kmp演算法的實現中,使用乙個輔助陣列next,使用該陣列儲存p[j]匹配不成功時,要進行下一輪匹配的k的值.即是當s[i] 和 p[j]匹配不成功時,

用p[ next[j] ]來和s[i]進行下一輪匹配,k = next[j] .

對陣列next 的求解,可以goolge到不少的方法,這裡使用最簡單的遞推的方法:

首先假定next[0] = –1,那麼當next[j] = k時,就有:p[0,…,j-1] == p[j-k+1,…,j-1]。

這時,若有p[k] = p[j] ,則p[0,….,k] = p[j-k+1,..,j-1,j],從而就有next[j+1] = next[j] + 1 = k +1 .

若p[k] != p[j] ,可以看著模式串對自身進行匹配的問題,即當匹配失敗的時候,k值如何確定,k = next [k] .

資料結構 串

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第...

資料結構 串

串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...

資料結構 串

串 adt string 資料關係 r1 基本操作 strassign t,chars chars是字元常量。生成乙個其值等於chars的串t。strcopy t,s 串s存在則由串s複製得串t strempty s 串s存在則若s為空串,返回真否則返回假 strcompare s,t 串s和t存在...