栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

kmp算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

kmp算法

# coding=utf-8
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
# Definition for singly-linked list.
#kmp算法
class Solution(object):
    def strStr(self, haystack, needle):
        '''
        :param target_str:
        :param pattern_str:
        :return:
        '''
        def ListCmp(i, m):#常规比较串相等返回T否则,返回F
            j = 0
            while i <= m:
                if needle[j] == needle[i]:
                    i += 1
                    j += 1
                else:
                    return False
            return True
        list_pattern = [0]  # 此表用来记录模式串每个长度的最长子串
        def ListPattern():
            for a in range(1, len(needle)):  # 感觉是个递归啊?m去查m-1的表,如果
                for guard_bh in range((a - list_pattern[a - 1]), a + 1):
                    if ListCmp(guard_bh, a) == True:  # 匹配上了加入list_pattern,如果到最后还没匹配到
                        list_pattern.append(a - guard_bh + 1)
                        break
                    else:
                        if guard_bh == a:
                            list_pattern.append(0)
                        else:
                            pass
        if needle=='':
            return ''
        else:
            ListPattern()
            i=0
            j=0
            while i!=len(haystack) or((len(haystack)-i)>(len(needle)-j)):
                if haystack[i]==needle[j]:#相等
                    if j==len(needle)-1:#如果已经是最后一个字符
                        return i-j
                    else:#如果不是,继续匹配
                        i+=1
                        j+=1
                else:#如果不相等,将i,j索引赋给模式串匹配函数
                    if j==0:
                        i+=1
                    else:
                        j=list_pattern[j-1]
            return -1


对应leetcode28题,看了kmp的原理自己写的实现,先用表将模式串的每个索引的最长公共前后缀写一张表,然后每次出现匹配不到的情况都去表中取相应的公共前后缀长度,来调整模式串指针的位置

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313720.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号