📅  最后修改于: 2023-12-03 15:28:48.672000             🧑  作者: Mango
门|门CS 2008年的第35题要求实现一个简单的字符串匹配算法。给出一个文本串和一个模式串,判断文本串中是否包含模式串,如果包含,则返回该模式串在文本串中第一次出现的位置。如果不包含,则返回-1。
这道题可以使用朴素的字符串匹配算法,即从文本串的每一个位置开始,逐个比较模式串和文本串的字符是否相同。若匹配成功,则返回该模式串在文本串中的位置。否则,将模式串向后移动一位,继续匹配,直至匹配成功或者失败。
朴素算法的时间复杂度最坏情况下为$O(mn)$,其中$m$为模式串长度,$n$为文本串长度。当模式串和文本串长度相等时,时间复杂度达到最高。
优化算法可以考虑使用KMP算法、Boyer-Moore算法或Sunday算法等高效的字符串匹配算法,它们的时间复杂度均为$O(m+n)$。
以下是使用朴素算法实现的示例Python代码:
def naive_match(text, pattern):
n = len(text)
m = len(pattern)
for i in range(n - m + 1):
j = 0
while j < m and text[i+j] == pattern[j]:
j += 1
if j == m:
return i
return -1
以下是使用KMP算法实现的示例Python代码:
def build_next(pattern):
m = len(pattern)
next = [0] * m
j = 0
for i in range(1, m):
while j > 0 and pattern[i] != pattern[j]:
j = next[j-1]
if pattern[i] == pattern[j]:
j += 1
next[i] = j
return next
def kmp_match(text, pattern):
n = len(text)
m = len(pattern)
next = build_next(pattern)
j = 0
for i in range(n):
while j > 0 and text[i] != pattern[j]:
j = next[j-1]
if text[i] == pattern[j]:
j += 1
if j == m:
return i - m + 1
return -1