串的定義:
串(string)是計算機資訊處理中最常見的一種資料結構,是有限的字串行,記作s = 「a1a2a3…an」
其中s是串名,雙引號之間的字串行為串的值,雙引號是串的分界符,並不是串的成分。其中「ai(1<=i空串、空格串和子串
空串:由零個字元組成的串,通常為兩個相鄰的雙引號來表示空串,例如:s = 「」,這兩個雙引號之間沒有任何字元,故s表示乙個空串,空串的長度為0。
空格串:表示僅由空格字元(asicii編碼為32)組成的串通常在兩個雙引號之間包含一定的空格字元,例如:s = 「 」,這兩個雙引號之間存在有一些空格字元,故表示空格串。
子串:串中任意個連續的字元組成的序列稱為該串的子串。
注:若串中存在空格,空格計算在串的長度中,例如:s = 「i love programming」,則串s的長度為18。
在c語言中,使用雙引號引起來的乙個和單引號引起來的單個字元是存在區別的,例如:s1 = 「a」 和s2 = 'a』兩者是存在區別的,s1表示字串而s2表示單個字元。
串在計算機中的三種儲存方式:
字串模式匹配(pattern matching)又稱為子串定位運算。
在模式匹配中,一般將主串稱為目標串,子串稱為模式串。模式匹配成功是指在目標串中找到模式串;匹配不成功是指目標串中不存在模式串。模式匹配經常應用於各類文字編輯程式中對某一特定字元的查詢,這樣可以大大提高文字編輯程式的響應速度,響應效能。
一、bf演算法(brute force)
即暴力(brute force)演算法,是一種普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元;若不相等,則比較s的第二個字元和t的第乙個字元,依次比較下去,直到得出最後的匹配結果。bf演算法是一種蠻力演算法,bf演算法的時間複雜度為 o(n*m)(n是文字的長度,m是模式字串的長度)。
bf演算法實現
bf演算法在主串和子串匹配失敗時,主串進行的回溯操作會影響整體匹配的效率,回溯之後,主串與子串有些部分比較是沒有必要的。這種簡單的丟棄前面的匹配資訊是bf演算法之所以效率低下的乙個重要原因。/****************************************
* 函式名稱:bfindex(elemtype *s, elemtype *t)
* 功能描述:bf匹配演算法主體
* 傳入引數:elemtype *s 傳入的主串
* elemtype *t 傳入的模式串
* 返回值:若匹配完成返回模式串在主串的那個位
* 置(主串中模式串首所在的下標位置)
* 若未匹配到則返回-1
*****************************************/
intbfindex
(elemtype *s, elemtype *t)
else}if
(j == tlen)
else
}
二、kmp演算法(knuth-morris-pratt)
knuth-morris-pratt 演算法簡稱為 「kmp 演算法」,常用於在乙個文字串 s 內查詢乙個模式串 p 的出現位置,這個演算法由 donald knuth、vaughan pratt、james h. morris 三人於 1977 年聯合發表,故取這三人的姓氏命名此演算法,kmp演算法的時間複雜度為 o(n+m)(n是文字的長度,m是模式字串的長度)。其中在kmp演算法中需要認真理解的就是其中的匹配過程到程式編寫的轉化,只有多次試驗以及思考才能知道其中的含義!下面是kmp演算法的具體實現:
1. 獲取字串長度
kmp演算法的next[ ]陣列求取方法:next[ ]陣列的作用:當模式串發生失配時,指導文字串將以哪個字元與模式串進行比較。sd/*************************************
* 函式名稱:getstringlen(char *s)
* 功能描述:獲取字串長度
* 傳入引數:待獲取長度的字串
* 返回值:字串長度
*************************************/
intgetstringlen
(char
*s)return len;
}
eded
ddde
下標012
3456
78next[ ]-100
1230
002. next[ ]陣列獲取
3. kmp演算法實現/*************************************
* 函式名稱:getkmpnext(elemtype *p, int next)
* 功能描述:求kmp演算法的next
* 傳入引數:elemtype *p 傳入模式字串
* int next kmp演算法的next
* 返回值:空
*************************************/
void
getkmpnext
(elemtype *p,
int next)
else
}}
?/****************************************
* 函式名稱:kmpindex(elemtype *s, elemtype *t)
* 功能描述:kmp匹配演算法主體
* 傳入引數:elemtype *s 傳入的主串
* elemtype *t 傳入的模式串
* 返回值:若匹配完成返回模式串在主串的那個位
* 置(主串中模式串首所在的下標位置)
* 若未匹配到則返回-1
*****************************************/
intkmpindex
(elemtype *s, elemtype *t)
else}if
(j == tlen)
/*匹配完成*/
else
}
o_o …
(⊙o⊙)
?
字元字串模式匹配演算法 BF演算法與KMP演算法
需解決的問題 從主字串s中尋找子字串t出現的第乙個位置?如果出現,返回pos,否則,返回 1 一 bf演算法 bf演算法就是樸素模式匹配演算法,即暴力求解,迴圈遍歷。將子字串的每個字元和主字串的字元按順序比較,如果比較不相等時,兩個字串的索引i和j同時回退,i回退到剛才主字串起始位置的下一位,子字串...
資料結構與演算法 字串匹配 BF演算法
又稱暴力匹配演算法,是一種樸素的模式匹配演算法 給定主串 s bilibili 和子串 t bilididi 1.主串 s 第一位開始與子串 t 第一位匹配,b 與 l 不匹配,匹配失敗 2.主串 s 第二位開始與子串 t 第一位匹配,i 與 l 不匹配,匹配失敗 3.主串 s 第三位開始與子串 t...
字串匹配演算法 BF及KMP
以 absababcef 與 abce 為例,求串2與串1匹配的第乙個位置的下標 這裡即輸出 5 一般的,我們可以從串1的起始位置開始與串2比較,若相同則兩串都向後移,否則,串1回到第二個位置,串2回到起始位置重新比較。本題用此方法會超時 includeint a 10001 b 10001 int...