一. 問題: 查找匹配字符串
如從searchText = “fabfafabfab” 中找是否有匹配的字符串 pattern = “fabfab”
二. 算法:
Solution 1: 暴力求解,每次移
Solution 2: 快速移動
其中next數組中的值爲當前字符前的字符串(preSub)的最長的相同前綴後綴的長度,
如pattern[5] = b. preSub = fabfa. fabfa 的最長相同前綴是 preSub[0,1] = fa, 後綴是preSub[4,5] = fa
Solution3:優化的Solution2的Next數組
三. 代碼
沒有優化的求next數組代碼:
void GetNext(string &p, vector<int> & next)
{
int pLen = p.size();
int k = -1;
int j = 1;
while (j < pLen)
{
if (k > -1 )
{
if(p[j-1] == p[k]){
next[j++] = ++k;
}
else {
k = next[k];
}
}
else
{
k = 0;
next[j++] = k;
}
}
}
四. 其圖解釋
1. 遞歸求解Next[j] 當 p[j] != p[k]時
2. 優化Next數組:
五. 參考: https://blog.csdn.net/v_JULY_v/article/details/7041827