Python - 长度为 K 的连续字符


连续字符是指连续出现的字符。长度为 K 的连续字符意味着同一个字符连续出现了 K 次。在本文中,我们将采用几种方法来实现它。我们将首先使用循环语句进行暴力搜索。接下来,我们将使用正则表达式、滑动窗口技术等方法执行相同的操作。滑动窗口是一种更好、更优化的查找长度为 K 的连续字符的方法。NumPy 库也为我们提供了采用类似技术的方法。

使用暴力方法

暴力法是一种简单的算法,我们可以不考虑优化的情况下想到它。对于我们的例子,我们可以使用以下方法

  • 初始化一个空列表。

  • 迭代字符串。由于我们需要找到 K 个连续的字符,迭代 n-k+1 次就足够了。

  • 接下来,在每次迭代中取出包含接下来的 K 个字符的子字符串。

  • 从中创建一个集合并找到长度。如果长度为 1,则序列中的所有字符都相同。将结果添加到列表中。

示例

在下面的示例中,我们定义了一个名为 find_consecutive_characters 的函数。它将字符串和值 K 作为参数。接下来,我们定义了一个名为 result 的空列表。我们迭代了 n-k+1 次。在每次迭代中,我们都使用了字符串索引方法来获取字符串的长度为 K 的子字符串。我们使用 set 函数访问子字符串的唯一字符。我们使用 len 方法查找子字符串的长度,并检查它是否等于 1。如果是,则将子字符串添加到列表中。

def find_consecutive_characters(string, k):
    n = len(string)
    result = []
    
    for i in range(n - k + 1):
        substring = string[i:i+k]
        if len(set(substring)) == 1:
            result.append(substring)
    
    return result

test_string="aaabcedfffghikkk"
k=3
print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")

输出

Consecutive characters with length 3 are: ['aaa', 'fff', 'kkk']

使用 re 库

Python 中的 re 库是一个强大的工具,它支持正则表达式。正则表达式(通常缩写为 regex 或 regexp)是根据特定规则匹配和操作文本字符串的模式。该库允许我们在字符串中搜索模式,提取字符串的特定部分,替换字符串等。虽然我们也可以构建类似的逻辑,但 re 库为这个问题提供了最佳方法。

示例

在下面的代码中,导入 re 库后,我们创建了一个名为 find_consecutive_characters 的函数,它接收字符串的名称和长度 K。接下来,我们将模式定义为一个字符串并将其存储在 pattern 变量中。我们使用 re 库的“findall”方法查找具有该模式的所有子字符串。它返回一个包含元组的列表。每个元组包含两个组成部分,第一个是完全匹配,第二个是被捕获的元素。我们使用列表推导式将元组的第一个元素添加到列表的元素中。我们从函数返回结果。我们使用值为 K 的字符串进行测试。我们调用该函数并打印结果。

import re

def find_consecutive_characters(string, k):
    pattern = r"((.)\2{%d})" % (k - 1)
    result = re.findall(pattern, string)
    result = [match[0] for match in result]
    
    return result

test_string="abdffghttpplihdf"
k=2
print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")

输出

Consecutive characters with length 2 are: ['ff', 'tt', 'pp']

使用滑动窗口

滑动窗口是一种流行的编程技术,我们可以用它来搜索数组或列表等对象序列中的模式。你应该通过滑动来滑动一个固定长度的窗口穿过数据。当处理子数组、子字符串等时,该方法尤其重要。对于我们的问题,我们想要查找具有相同字符和长度 K 的子序列。因此,滑动窗口可能是一个不错的选择。

示例

在下面的代码中,我们创建了 find_consecutive_characters 方法,这是一个非空函数,它返回长度为 K 的连续字符列表。在这个函数中,我们首先定义了一个名为 result 的空列表,然后使用前 K 个元素 a 和 set 方法将其转换为集合。如果集合的长度为 1,我们将子字符串添加到已初始化的列表中。然后,我们对其余子字符串实现了类似的算法。我们返回列表。

def find_consecutive_characters(string, k):
    n = len(string)
    result = []
    window = string[:k]
    if len(set(window)) == 1:
        result.append(window)
    for i in range(k, n):
        window = window[1:] + string[i]
        if len(set(window)) == 1:
            result.append(window)   
    return result
test_string="xxxxangduuuu"
k=4
print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")

输出

Consecutive characters with length 4 are: ['xxxx', 'uuuu']

使用 NumPy 库

NumPy 是 Python 中用于数值计算的流行库。该库允许程序员以 NumPy 数组的形式执行操作。这些数组的实现效率很高,使它们成为程序员的流行选择。NumPy 库有一个函数可以有效地处理滑动窗口。因此,我们可以利用内置方法来生成长度为 K 的连续字符。

示例

在下面的代码中,我们导入了 NumPy 库。我们创建了函数 find_consecutive_characters,它将字符串和长度 K 作为参数。在函数中,我们使用“frombuffer”方法将字符串转换为 NumPy 数组。我们使用 sliding_window_view 方法在字符中实现滑动窗口。接下来,我们使用了列表推导式技术,该技术仅在窗口中唯一字符的计数为 1 时才附加元素。

import numpy as np
def find_consecutive_characters(string, k):
    arr = np.frombuffer(string.encode(), dtype=np.uint8)
    windows = np.lib.stride_tricks.sliding_window_view(arr, k)
    result = [window.tobytes().decode() for window in windows if np.unique(window).size == 1]
    return result

test_string="xxxxangduuuu"
k=4
print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")

输出

Consecutive characters with length 4 are: ['xxxx', 'uuuu']

结论

在本文中,我们了解了如何查找字符串的长度为 K 的连续字符。我们可以为此定义自己的逻辑。否则,Python 有几个库和包可以帮助我们做到这一点。我们首先看到了暴力方法。暴力方法很容易理解,但效率可能不高——像“re”这样的库允许我们实现更简单的算法。我们还可以使用滑动窗口方法,这是一种流行的编程技术。

更新于:2023年7月18日

1K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告