本分類記錄了本人在hihocode上面嘗試的結果,現在分享出來,大家一起學習。
小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。
這一天,他們遇到了乙隻河蟹,於是河蟹就向小hi和小ho提出了那個經典的問題:「小hi和小ho,你們能不能夠判斷一段文字(原串)裡面是不是存在那麼一些……特殊……的文字(模式串)?」
小hi和小ho仔細思考了一下,覺得只能想到很簡單的做法,但是又覺得既然河蟹先生這麼說了,就肯定不會這麼容易的讓他們回答了,於是他們只能說道:「抱歉,河蟹先生,我們只能想到時間複雜度為(文字長度 * 特殊文字總長度)的方法,即對於每個模式串分開判斷,然後依次列舉起始位置並檢查是否能夠匹配,但是這不是您想要的方法是吧?」
河蟹點了點頭,說道:」看來你們的水平還有待提高,這樣吧,如果我說只有乙個特殊文字,你能不能做到呢?「
小ho這時候還有點暈暈乎乎的,但是小hi很快開口道:」我知道!這就是乙個很經典的模式匹配問題!可以使用kmp演算法進行求解!「
河蟹滿意的點了點頭,對小hi說道:」既然你知道就好辦了,你去把小ho教會,下週我有重要的任務交給你們!「
」保證完成任務!」小hi點頭道。
提示一:kmp的思路
提示二:next陣列的使用
提示三:如何求解next陣列
第一行乙個整數n,表示測試資料組數。
接下來的n*2行,每兩行表示乙個測試資料。在每乙個測試資料中,第一行為模式串,由不超過10^4個大寫字母組成,第二行為原串,由不超過10^6個大寫字母組成。
其中n<=20
對於每乙個測試資料,按照它們在輸入中出現的順序輸出一行ans,表示模式串在原串中出現的次數。
樣例輸入
5hahahaha
wqnwqn
adaadadada
bababb
bababababababababb
dadaddaadaaddaaadaad
樣例輸出
31310
下面是常規的字串匹配的方法:
#include
#include
#include
//返回乙個字串中,特定子串的個數
int calsubstrcount(const char *str, const char *substr)
if ((*psubstr) == '\0')
}return count;
}int main(int argc, char *argv)
return 0;
}
未完,待續。。。
演算法之KMP
kmp演算法是一種字串匹配演算法,時間複雜度為 m n 個人對演算法學習還在初級階段。以前對字串匹配用暴力匹配演算法。暴力匹配演算法 兩個字串,模板串mo和文字串s。如果用暴力演算法,對於模板串mo,用i表示模板串匹配的位置。用j表示文字串匹配的位置。1,如果從一開始匹配的上,i和j同時增加。2,當...
KMP演算法之k next Pk
最近在看 大話資料結構 在串這章中,講到關於kmp演算法。其中關於在一直前j個next值,如何求得j 1的值,有個公式一直不是很理解,後來查了下資料,終於搞懂了。模式字串記為p 下標從0開始 next q k 表示p q 之前的子串中,存在長度為k的相同字首和字尾,即p 0 p k 1 與p q k...
初探KMP演算法之next nextval
這種演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為克努特 莫里斯 普拉特演算法 簡稱為kmp演算法 此演算法可以在o m n 的時間數量級上完成串的模式匹配操作。其改進在於 每當一趟匹配過程中出現字元比較不等時,不需要回溯 i 指標,而是利用已經得到的...