字串(string) 是由 n 個字元組成的乙個有序整體( n >= 0 )。例如,s = 「beijing」 ,s 代表這個串的串名,beijing 是串的值。這裡的雙引號不是串的值,作用只是為了將串和其他結構區分開。字串的邏輯結構和線性表很相似,不同之處在於字串針對的是字符集,也就是字串中的元素都是字元,線性表則沒有這些限制。
在實際操作中,我們經常會用到一些特殊的字串:
當要判斷兩個串是否相等的時候,就需要定義相等的標準了。只有兩個串的串值完全相同,這兩個串才相等。根據這個定義可見,即使兩個字串包含的字元完全一致,它們也不一定是相等的。例如 b = 「beijing」,c = 「bjingei」,則 b 和 c 並不相等。
字串的儲存結構與線性表相同,也有順序儲存和鏈式儲存兩種。
因此,串的鏈式儲存結構除了在連線串與串操作時有一定的方便之外,總的來說,不如順序儲存靈活,在效能方面也不如順序儲存結構好。
字串的新增操作和陣列非常相似,都牽涉對插入字串之後字元的挪移操作,所以時間複雜度是 o(n)。
例如,在字串 s1 = 「123456」 的正中間插入 s2 = 「abc」,則需要讓 s1 中的 「456」 向後挪移 3 個字元的位置,再讓 s2 的 「abc」 插入進來。很顯然,挪移的操作時間複雜度是 o(n)。不過,對於特殊的插入操作時間複雜度也可以降低為 o(1)。這就是在 s1 的最後插入 s2,也叫作字串的連線,最終得到 「123456abc」。
字串的刪除操作和陣列同樣非常相似,也可能會牽涉刪除字串後字元的挪移操作,所以時間複雜度是 o(n)。
例如,在字串 s1 = 「123456」 的正中間刪除兩個字元 「34」,則需要刪除 「34」 並讓 s1 中的 「56」 向前挪移 2 個字元的位置。很顯然,挪移的操作時間複雜度是 o(n)。不過,對於特殊的插入操作時間複雜度也可以降低為 o(1)。這就是在 s1 的最後刪除若干個字元,不牽涉任何字元的挪移。
例如,字串 s = 「goodgoogle」,判斷字串 t = 「google」 在 s 中是否存在。需要注意的是,如果字串 t 的每個字元都在 s **現過,這並不能證明字串 t 在 s **現了。當 t = 「dog」 時,那麼字元 「d」、「o」、「g」 都在 s **現過,但他們並不連在一起。
那麼我們如何判斷乙個子串是否在字串**現過呢?這個問題也被稱作子串查詢或字串匹配,接下來我們來重點分析。
首先,我們來定義兩個概念,主串和模式串。我們在字串 a 中查詢字串 b,則 a 就是主串,b 就是模式串。我們把主串的長度記為 n,模式串長度記為 m。由於是在主串中查詢模式串,因此,主串的長度肯定比模式串長,n>m。因此,字串匹配演算法的時間複雜度就是 n 和 m 的函式。
假設要從主串 s = 「goodgoogle」 中找到 t = 「google」 子串。根據我們的思考邏輯,則有:
public
voids1(
) jc = j;}if
(jc == t.
length()
-1)}
} system.out.
println
(isfind)
;}
查詢出兩個字串的最大公共字串:
假設有且僅有 1 個最大公共子串。比如,輸入 a = 「13452439」, b = 「123456」。由於字串 「345」 同時在 a 和 b **現,且是同時出現在 a 和 b 中的最長子串。因此輸出 「345」。
對於這個問題其實可以用動態規劃的方法來解決。
假設字串 a 的長度為 n,字串 b 的長度為 m,可見時間複雜度是 n 和 m 的函式。
從**結構來看,第一步需要兩層的迴圈去查詢共同出現的字元,這就是 o(nm)。一旦找到了共同出現的字元之後,還需要再繼續查詢共同出現的字串,這也就是又巢狀了一層迴圈。可見最終的時間複雜度是 o(nmm),即 o(nm²)。**如下:
public
voids2(
)if(max_len < m-i+1)
}}}}
system.out.
println
(maxsubstr)
;}
字串的邏輯結構和線性表極為相似,區別僅在於串的資料物件約束為字符集。但是,字串的基本操作和線性表有很大差別:
在字串的基本操作中,通常以「串的整體」作為操作物件;
字串的增刪操作和陣列很像,複雜度也與之一樣。但字串的查詢操作就複雜多了,它是參加面試、筆試常常被考察的內容。
什麼是字串匹配演算法?
現要匹配兩字串的相同內容 第一輪 我們從主串的首位開始,把主串和模式串的字元逐個比較 顯然,主串的首位字元是a,模式串的首位字元是b,兩者並不匹配。第二輪 我們把模式串後移一位,從主串的第二位開始,把主串和模式串的字元逐個比較 主串的第二位字元是b,模式串的第二位字元也是b,兩者匹配,繼續比較 主串...
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...