KMP的應用例項

2021-07-09 17:56:51 字數 1238 閱讀 2199

在沒學習kmp之前,如果要在乙個串裡匹配查詢另乙個串。可能的實現如下:

#include#includeint match(const char *w,const char *t)

else

}if (pattern_index == pattern_length)

return target_index - pattern_length;

else

return -1;

}int main()

上面的演算法時間複雜度是o(pattern_length*target_length)。

我們主要把時間浪費在什麼地方觀查index =2那一步,我們已經匹配了3個字元,而第4個字元是不匹配的,這時我們已經匹配的字串行是nan,

此時如果向右移動一位,那麼nan最先匹配的字串行將是an,這肯定是不能匹配的,之後再右移一位,匹配的是nan最先匹配的序列是n,這是可以匹配的。

如果我們事先知道pattern本身的這些資訊就不用每次匹配失敗後都把target_index回退回去,這種回退就浪費了很多不必要的時間,

如果能事先計算出pattern本身的這些性質,那麼就可以在失配時直接把pattern移動到下乙個可能的位置,把其中根本不可能匹配的過程省略掉,

如上表所示我們在index=2時失配,此時就可以直接把pattern移動到index=4的狀態,kmp演算法就是用來解決這個問題的。

下面是應用kmp優化後的實現

#include#includeinline void buildnext(const char *t, int next)  

} int match(const char *w, const char *t);

//構建next陣列

buildnext(t, next);

while (target_index < target_length - pattern_length + 1 && pattern_index < pattern_length)

else if (0 == pattern_index)

else

}if (pattern_index == pattern_length)

return target_index - pattern_length;

else

return -1;

}int main()

kmp的簡單應用

給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長度小於1000000 string1和string2中保證不出現空格。對於每組輸入資料,若s...

擴充套件KMP的應用

擴充套件kmp的應用 最長公共字首長度,記為extend i 或者說,extend i 為滿足s i.i z 1 t 0.z 1 的最大的z值 擴充套件kmp可以用來解決很多字串問題,如求乙個字串的最長回文子串和最長重複子串。擴充套件kmp next i x i.m 1 的最長公共字首 extend...

KMP簡單應用

kmp簡單應用 time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長...