1、字符串匹配问题 给定一个s字符串和一个n字符串,在s字符串中找出n字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1 kmp算法 代码+算法分析
时间: 2024-02-13 21:03:08 浏览: 90
几种字符串匹配算法的分析和比较.doc
KMP算法是用于解决字符串匹配问题的经典算法之一。它的基本思想是:在匹配过程中,如果当前字符匹配失败,我们不用像朴素算法那样回退到s串中匹配的第一个字符,而是可以利用已经匹配的信息,跳过一些无需比较的字符,从而提高匹配的效率。
下面是KMP算法的代码实现:
```python
def kmp(s: str, n: str) -> int:
# 计算n字符串的next数组
def get_next(n: str) -> List[int]:
next = [-1] * len(n)
i, j = 0, -1
while i < len(n) - 1:
if j == -1 or n[i] == n[j]:
i += 1
j += 1
next[i] = j
else:
j = next[j]
return next
next = get_next(n)
i, j = 0, 0
while i < len(s) and j < len(n):
if j == -1 or s[i] == n[j]:
i += 1
j += 1
else:
j = next[j]
if j == len(n):
return i - j
else:
return -1
```
代码分析:
- get_next函数:用于计算n字符串的next数组,其中next数组的含义是:对于n字符串中的每个位置i,它的前缀和后缀的最长公共部分的长度。
- i和j分别表示s和n字符串的当前匹配位置,如果匹配成功,则i和j同时加1;如果匹配失败,则将j跳转到next[j]位置,继续匹配。
- 如果匹配成功后,j的值等于n字符串的长度,则说明匹配成功,返回i-j即为n字符串在s字符串中出现的位置;否则返回-1。
KMP算法的时间复杂度为O(m+n),其中m和n分别为s和n字符串的长度,空间复杂度为O(n),即next数组的大小。
阅读全文