字串的模式匹配是資料結構中很重要的一部分內容,它是字串的乙個應用。記得當時吳暇老師給我們將資料結構的時候多次強調的,已經還給老師多年,今天來review下。
所謂模式匹配是這個意思:有兩個字串,such as 「abbcabd" n 」bca」。求bca是不是abbcabd的子串,如果是就返回在abbcabd中出現的bca的下標值。在這個demo中是2。那麼abbcabd叫作目標串(subject),bca叫模式串(pattern)
模式匹配乙個直觀的演算法就是逐個進行匹配檢驗。也就是從目標串的第0個元素開始和模式串的第0個元素進行比較。如果相等,再從模式串的第1個元素和目標串的第1個元素進行比較。。。如果一旦不相等,就回退回去。這裡有乙個bf演算法。實現如下:
int bfmatch(std::string subject, std::string pattern)
bf的時間複雜度最好的情況下是o(m),最壞的情況下是o(n*m),其中m是模式串的長度,n是目標串的長度。
對bf演算法進行優化,就有了大名鼎鼎的kmp演算法。kmp利用了模式串本身的對稱性,在進行匹配失敗的時候,i指標不用進行回溯。而是根據 j的在next陣列中的值進行處理。
如果next[j]==k(k!=-1):j不用從0開始,而是從模式串上的第k個位置開始,在進行匹配
所以在bf演算法的基礎上只要進行一點點的改動就有了kmp下的模式匹配,實現如下:
int kmpmatch(std::string subject, std::string pattern)
so,剩下的問題就是怎麼計算next陣列。next陣列的計算可以說是kmp演算法最最精彩的部分,當時學的時候也是很confuse,後來終於是理解了。next陣列有多重計算方法,得出的值也是不盡相同,現在展示兩種教程上的。分別記為next和nextval,後者是前者的改進。**如下:void getnextarray(char pattern, int next) else
}return;
}
void getnextarrayadvanced(char pattern, int next) else
}else
}return;
}
字串模式匹配
include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...
字串模式匹配
子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...
字串模式匹配
bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...