KMP算法

KMP算法解決的問題:

 KMP算法解決字符串匹配問題干毅,給兩個字符串循未,查找其中一個字符串是否包含另一個字符串,如果包含搏存,返回包含的起始位置
時間復雜度為 o(m+n)

KMP偽代碼

  1. 在串S和串T中分別設(shè)比較的起始下標i和j
  2. 如果S和T的的所有字符未比較完瑰步,則循環(huán)
    2.1 如果S[i] == T[j],繼續(xù)比較S和T的下一個字符
    2.2 否則將j滑向next[j]的位置,即 j = next[j]
    2.3 如果j == -1,則將i和j分別+1璧眠,準備下一趟比較
  3. 如果T中的字符串均比較完畢缩焦,則返回匹配的起始下標,否則返回-1

next數(shù)組求解

image.png

next數(shù)組的兩種求解方式

直接插入-1法

懶貓老師-數(shù)據(jù)結(jié)構(gòu)-(15)KMP算法2-next數(shù)組(模式匹配,字符串匹配)

n = len(needle)
prefixArr = [0] * n
j = -1
i = 0
prefixArr[0] = -1
while i < n - 1:
    if j == -1 or needle[j] == needle[i]:
        j += 1
        i += 1
        prefixArr[i] = j
    else:
        j = prefixArr[j]
直接插入-1法 感想
移位插入-1法

KMP字符串匹配算法
三哥講解KMP算法part1
三哥講解KMP算法part2之尋找前綴的方法

n = len(needle)
prefixArr = [0] * len(needle)
j = 0
i = 1
while i < n:
    if needle[j] == needle[i]:
        j += 1
        prefixArr[i] = j
        i += 1
    else:
        if j > 0:
            j = prefixArr[j - 1]
        else:
            prefixArr[i] = j
            i += 1
prefixArr.insert(0,-1)
prefixArr.pop()

28. 實現(xiàn) strStr()


class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        m = len(haystack)
        n = len(needle)
        if m == 0 and n == 0 or n == 0:
            return 0
        i = 0
        j = 0
        nextArr = self.prefixArr(needle)
        while i < m and j < n:
            if j == n - 1 and haystack[i] == needle[j]:
                return i - j

            if j == -1 or haystack[i] == needle[j]:
                j += 1
                i += 1
            else:
                j = nextArr[j]
        return -1


    def prefixArr(self, s:str) -> list:
        j = -1
        i = 0
        n = len(s)
        nextArr = [0] * n
        nextArr[0] = j
        while i < n - 1:
            if j == -1 or s[i] == s[j]:
                j += 1
                i += 1
                nextArr[i] = j
            else:
                j = nextArr[j]
        return nextArr
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛆橡,一起剝皮案震驚了整個濱河市舌界,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泰演,老刑警劉巖呻拌,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異睦焕,居然都是意外死亡藐握,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門垃喊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猾普,“玉大人,你說我怎么就攤上這事本谜〕跫遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵乌助,是天一觀的道長溜在。 經(jīng)常有香客問我,道長他托,這世上最難降的妖魔是什么掖肋? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮赏参,結(jié)果婚禮上志笼,老公的妹妹穿的比我還像新娘。我一直安慰自己把篓,他們只是感情好纫溃,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著韧掩,像睡著了一般皇耗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天郎楼,我揣著相機與錄音,去河邊找鬼窒悔。 笑死呜袁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的简珠。 我是一名探鬼主播阶界,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聋庵!你這毒婦竟也來了膘融?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祭玉,失蹤者是張志新(化名)和其女友劉穎氧映,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脱货,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡岛都,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了振峻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼疫。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扣孟,靈堂內(nèi)的尸體忽然破棺而出烫堤,到底是詐尸還是另有隱情,我是刑警寧澤凤价,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布鸽斟,位于F島的核電站,受9級特大地震影響料仗,放射性物質(zhì)發(fā)生泄漏湾盗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一立轧、第九天 我趴在偏房一處隱蔽的房頂上張望格粪。 院中可真熱鬧,春花似錦氛改、人聲如沸帐萎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疆导。三九已至,卻和暖如春葛躏,著一層夾襖步出監(jiān)牢的瞬間澈段,已是汗流浹背悠菜。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败富,地道東北人悔醋。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像兽叮,于是被迫代替她去往敵國和親芬骄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容