📜  门|门CS 2008 |第 35 题(1)

📅  最后修改于: 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