kmp演算法是在最近這兩年的軟體設計師考試中才出現的。2次都是讓求next函式的序列(其實是)。先看看題吧。
(2023年下半年上午題)
(2023年上半年上午題)
其實做這個題很簡單,我先說說這個題裡的各種概念。
給定的字串叫做模式串t。j表示next函式的引數,其值是從1到n。而k則表示一種情況下的next函式值。p表示其中的某個字元,下標從1開始。看等式左右對應的字元是否相等。
好了,開始做題了。
首先,要把字串填入到乙個**中:(拿第乙個題為例)
將j匯入next函式,即可求得,
j=1時,next[0]=0;
j=2時,k的取值為(1,j)的開區間,所以整數k是不存在的,那就是第三種情況,next[2]=1;
j=3時,k的取值為(1,3)的開區間,k從最大的開始取值,然後帶入含p的式子中驗證等式是否成立,不成立k取第二大的值。現在是k=2,將k匯入p的式子中得,p1=p2,即「a」=「b」,顯然不成立,捨去。k再取值就超出範圍了,所以next[3]不屬於第二種情況,那就是第三種了,即next[3]=1;
j=4時,k的取值為(1,4)的開區間,先取k=3,將k匯入p的式子中得,p1p2=p2p3,不成立。 再取k=2,得p1=p3,成立。所以next[4]=2;
j=5時,k的取值為(1,5)的開區間,先取k=4,將k匯入p的式子中得,p1p2p3=p2p3p4,不成立。 再取k=2,得p1p2=p3p4,不成立。 再取k=2,得p1=p4,成立。所以next[4]=2;
j=6時,k的取值為(1,6)的開區間,先取k=5,將k匯入p的式子中得,p1p2p3p4=p2p3p4p5,不成立。 取k=4,得p1p2p3=p3p4p5,不成立。再取k=3,將k匯入p的式子中得,p1p2=p4p5,成立。所以next[4]=3;
j=7時,k的取值為(1,7)的開區間,先取k=6,將k匯入p的式子中得,p1p2p3p4p5=p2p3p4p5p6,不成立。 再取k=5,得 p1p2p3p4=p3p4p5p6 ,不成立。 再取k=4,得 p1p2p3=p4p5p6 ,成立。所以next[4]=4;
j=8時,k的取值為(1,8)的開區間, 先取k=7,將k匯入p的式子中得,p1p2p3p4p5p6=p2p3p4p5p6p7,不成立。 再取k=6,得p1p2p3p4p5=p3p4p5p6p7,不成立。 再取k=5,得p1p2p3p4=p4p5p6p7,不成立。 再取k=4,得p1p2p3=p5p6p7,不成立。 再取k=3,得p1p2=p6p7,不成立。再取k=2,得p1=p7,不成立。k再取值就超出範圍了,所以next[3]不屬於第二種情況,那就是第三種了,即next[3]=1;
所以結果為:
好了,第二題留給大家做吧。
**
kmp演算法next例題 KMP演算法next陣列求解
kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...
KMP演算法中next陣列的計算
getnext的個人理解 首先先說一下next串的定義吧 在對於字串t中每個字元 t j 0 j len 1 存在乙個整數 k k使得模式串t中 開頭的k個字元依次與 t j 的前面的 k個字元相同。include 順序串.cpp 關於順序串的基本操作,下邊放有源 void getnext sqst...
KMP演算法 next陣列
通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...