Leetcode28字符串匹配之KMP算法

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。

题目描述:

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1

方法一:暴力搜索法 

 

首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。这有什么难的?

我们可以这样初始化:

 

之后我们只需要比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:

 

A和E不相等,那就把i指针移回第1位(假设下标从0开始),j移动到模式串的第0位,然后又重新开始这个步骤:

 

    def strstr(h,s):#h为搜索空间,s为关键字
        if len(s)==0:
            return 0
        if len(h)==0:
            return -1
        h_start = 0
        s_start = 0
        while h_start

方法二:KMP算法

在 i 处失配,那么主字符串和模式字符串的前边6位就是相同的。又因为模式字符串的前6位,它的前4位前缀和后4位后缀是相同的,所以我们推知主字符串i之前的4位和模式字符串开头的4位是相同的。就是图中的灰色部分。那这部分就不用再比较了。

Leetcode28字符串匹配之KMP算法_第1张图片

生成关键字的公共前缀后缀的数组:

Leetcode28字符串匹配之KMP算法_第2张图片 

我们这里用next数组指代pmt 。

def cal_next(strs):
	lenth = len(strs)
	pnext = [0 for _ in range(lenth)]
	i = 1 #当前数组的长度
	j = pnext[i-1] #当前索引的上一个索引的公共串长度
	while i

 完整KMP算法:

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        h,s = haystack,needle
        if len(s)==0:
            return 0
        if len(h)==0:
            return -1
        p_next = cal_next(s)
        print(p_next)
        start = 0
        i = 0
        while i

 

你可能感兴趣的:(编程,Leetcode,刷题)