📅  最后修改于: 2023-12-03 14:51:26.137000             🧑  作者: Mango
在编程中,我们常常需要统计字符串中某个子串的出现频率。这种需求在自然语言处理、文本挖掘、数据分析等领域中非常常见。本篇文章将为大家介绍几种常见的求子串频率的算法,以及它们的优缺点。
算法思路:对于原字符串中的每一个位置,检查该位置开始的子串是否和目标子串匹配。
算法实现(Python):
def count_substring(s, sub):
count = 0
for i in range(len(s)):
if s[i:].startswith(sub):
count += 1
return count
算法分析:
算法思路:利用已匹配部分的信息,尽量减少不必要的比较。
算法实现(Python):
def count_substring(s, sub):
def get_next(p):
i, j = 0, -1
next = [-1] * len(p)
while i < len(p) - 1:
if j == -1 or p[i] == p[j]:
i, j = i + 1, j + 1
next[i] = j
else:
j = next[j]
return next
count = 0
next = get_next(sub)
i, j = 0, 0
while i < len(s):
if s[i] == sub[j] or j == -1:
i, j = i + 1, j + 1
else:
j = next[j]
if j == len(sub):
count += 1
j = next[j-1]
return count
算法分析:
算法思路:根据目标子串中的字符出现情况,选择合适的匹配方式。
算法实现(Python):
def count_substring(s, sub):
def get_bad_char(sub):
bad_char = [-1] * 256
for i in range(len(sub)):
bad_char[ord(sub[i])] = i
return bad_char
def get_good_suffix(sub):
good_suffix = [0] * (len(sub) + 1)
i = len(sub) - 1
j = len(sub)
while i >= 0:
if j == len(sub) or sub[i] != sub[j]:
good_suffix[i], j = j - i, len(sub)
else:
i, j = i - 1, j - 1
return good_suffix
count = 0
bad_char = get_bad_char(sub)
good_suffix = get_good_suffix(sub)
i = 0
while i <= len(s) - len(sub):
j = len(sub) - 1
while j >= 0 and s[i+j] == sub[j]:
j -= 1
if j == -1:
count += 1
i += good_suffix[0]
else:
i += max(good_suffix[j+1], j - bad_char[ord(s[i+j])])
return count
算法分析:
总体来说,不同的算法适合不同的场景。如果需要高效匹配长文本串,可以考虑使用Boyer-Moore算法。如果需要实现简单,可以使用暴力匹配算法。如果需要更好的平均性能,可以选择KMP算法。