最近在刷資料結構,看到了字串匹配演算法kmp,bm,kp等,感覺是面試中應該要會的知識點,就先記錄下來了,方便之後的複習檢視:
1.kmp演算法
kmp演算法是在暴力演算法之上做了一些改進,不會重複的比對當前比對失敗的字首,即利用了匹配串本身的資訊來構造乙個查詢表next,該錶能夠指導當次匹配失敗下,如何對匹配串進行移動。可以省略掉一些重複比較的無用操作。
1.1next表構造
因為next表的構造其實本質也是字串的匹配,故其整體的框架和kmp相類似:
int* buildnext(const char* p)
else
t = n[t]; //把t往小的方向拉,匹配更小的真字首
} return n;
}
1.2.kmp演算法構造:
kmp的核心主要是1.1中的查詢表,當次匹配失敗時,能夠讓匹配串跳轉到適當的位置,從新開始匹配:
int kmpmatch(const char* p, const char* t)
else
j = next[j];
delete next;
return i - j;
}
1.3 next表改進
int* buildnext(const char* p)
else
t = n[t]; //把t往小的方向拉,匹配更小的真字首
} return n;
}
2.bm演算法
進一步的優化,採用壞字元和好字尾的策略。壞字元是利用字元匹配中的 「教訓」 來進行優化,好字尾是利用字元匹配的先驗知識 「經驗」來進行優化。兩者可以結合也可以分開實施優化。接下來分別的介紹壞字元bc和好字尾gs優化策略。
2.1壞字元表構造
int* buildbc(const char* p)
2.2基於壞字元的匹配演算法
int bmmatch(const char* p, const char* t)
delete bc;
return i;
}
面試經典 字串匹配問題
字串匹配問題描述 設有兩個字串a和b,a字串長度為n,b字串長度為m,現在要確定b字串是否出現在a字串中,如果是,返回位置,如果不是返回結果為false,在這裡,我們成字串b為模式字串,a為主串。最近經常會被問到字串匹配的問題,實際上這些問題在網上都有很多資源,我覺得沒有必要自己寫乙個,但是看了之後...
經典演算法 BF演算法(字串匹配)
字串的匹配演算法也是很經典的乙個演算法,在面試的時候常常會遇到,而bf演算法是字串模式匹配中的乙個簡單的演算法 bf演算法,即暴力 brute force 演算法,是普通的模式匹配演算法,思想簡單,結構也簡單 bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比...
字串匹配
題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...