KMP C語言實現

2021-09-20 12:30:00 字數 1008 閱讀 3886

這是我的第一篇部落格,希望以後可以堅持下去!

kmp原理:

kmp是在字串中尋找特定子串的演算法。假設:給定字串:s = "abcdefabcdex" ,下標用i表示;子串:t = "abcdex",下標用j表示;

我們希望在s中找到字串t,正常的方法是從s的第乙個字元'a'與t的第乙個字元'a'進行比較,然後依次比下去...當s找到"abcde"時,t也找到"abcde",哈哈還有一 個就成功了,但是我們的運氣不太好,s的下乙個字元是'f'而t的下乙個字元是'x',這個時候按照一般的演算法會回溯s的下標i到字元『b',然後重複上面的步驟,這裡就有乙個問題,當我們比較s的"abcde"和t的"abcde"的時候可以得到乙個資訊,那就是s的第乙個字元』a' 後面的四個字元(即'b''c''d''e')並沒有與t的乙個字元相同的字元,一般的演算法並沒有用到這個資訊,而kmp就利用這個資訊從而不必回溯s的下標i,只要回溯t的下標j(這裡注意因為字串t中也會有重複的字元,所以j並不需要每次都回溯到第乙個字元),kmp實現的關鍵就是j的回溯規則。通過分析j的回溯只跟字串t有關,通過t建立j的回溯規則陣列next,next[j]的值就是位置j要回溯的位置。

c語言實現**:

// 建立next陣列

int mknext(char const*t, int *next)

else

j = next[j];

} return 0;

}

//kmp實現

int index_kmp(char const*s, char const*t, int pos)

else

j = next[j];

} if (j >= t_len)

return i - t_len;

else

return -1;

}

這裡有乙個小問題:字串陣列作為函式形參宣告的時候要用char const*,不能是const char*。

snake python語言實現

import pygame,sys,time,random from pygame.locals import 引入必要模組 pygame.init pygame初始化 fpsclock pygame.time.clock 建立乙個控制遊戲速度的變數 playsu ce pygame.display...

C語言實現memcpy

memcpy和memmove都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊 的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。程式設計師面試寶典中有例題 對應的原型如下 v...

棧 Stack C 語言實現

棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰...