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”这样的库允许我们实现更简单的算法。我们还可以使用滑动窗口方法,这是一种流行的编程技术。