📌  相关文章
📜  包含另一个给定字符串作为子字符串的子字符串计数(1)

📅  最后修改于: 2023-12-03 14:50:25.749000             🧑  作者: Mango

包含另一个给定字符串作为子字符串的子字符串计数

在字符串处理中,经常需要查找一个给定字符串是否出现在另一个字符串中。本文介绍如何统计一个字符串中包含另一个字符串作为子字符串的子字符串数量。

方法一:暴力枚举

我们可以使用暴力枚举的方法遍历主字符串中的所有子字符串,并判断该子字符串是否包含给定字符串。时间复杂度为O(n^2)。

def count_substrings(s: str, sub: str) -> int:
    count = 0
    for i in range(len(s)):
        for j in range(i+1, len(s)+1):
            if sub in s[i:j]:
                count += 1
    return count
方法二:KMP算法

使用KMP算法查找子字符串的时间复杂度为O(n),因此在此基础上统计包含子字符串的子字符串数量的时间复杂度也是O(n)。

def count_substrings(s: str, sub: str) -> int:
    count = 0
    i, j = 0, 0
    while i < len(s):
        if s[i] == sub[j]:
            i += 1
            j += 1
        else:
            i = i - j + 1
            j = 0
        if j == len(sub):
            count += 1
            j = 0
    return count
方法三:正则表达式

使用正则表达式匹配子字符串,统计匹配次数即可。

import re

def count_substrings(s: str, sub: str) -> int:
    pattern = re.compile(sub)
    return len(pattern.findall(s))
总结

以上是三种常用的方法,根据实际需求选择最适合的方法。当需要重复统计多个字符串时,可以先使用KMP算法建立失配表,加快匹配速度。