Python程序获取K个不同字符的N大小子串

Python程序获取K个不同字符的N大小子串

在Python编程中,我们经常需要根据一定规则获取特定的字符串子串。本文将讲述如何使用Python编程语言获取由N个字符组成的K种不同字符的所有子串。

字符串的构成

要解决这个问题,我们首先需要理解Python字符串的构成。Python中的字符串是一种序列类型,由多个字符按照一定的顺序组成。在Python中,字符串类型有许多内置函数可以使用。以下是构成Python字符串的一些特点:

  • 字符串可以使用单引号或者双引号来表示,例如:”hello” 或者 ‘world’。
  • 字符串还可以使用三个引号字符串表示,例如:”’我是三个引号字符串”’。
  • 字符串是一个有序的字符序列,每个字符在字符串中都有对应的索引,可以通过相应的索引来访问每个字符。
  • 字符串的索引是从0开始的,最末尾的字符的索引为字符串长度减一。

获取N个字符的所有子串

为了获取所有K个不同字符的N大小子串,我们首先需要获取长度为N的所有子串,然后过滤掉不符合要求的子串。获取长度为N的所有子串的方法是通过使用Python中的切片操作,以及使用循环嵌套。以下是获取长度为N的子串的代码示例:

def get_sub_str(origin_str: str, n: int):
    sub_str_list = []
    length = len(origin_str)
    for i in range(length):
        for j in range(i + 1, length + 1):
            if j - i == n:
                sub_str = origin_str[i:j]
                sub_str_list.append(sub_str)
    return sub_str_list 

以上代码中的get_sub_str函数接受两个参数,第一个是原始字符串,第二个是子串长度。该函数会遍历原始字符串中的每个字符,使用切片操作获取第i个字符开始长度为n的子串,然后保存到一个列表中,并最终返回该列表。接下来,我们来对该代码进行解释:

  • 第一层循环是根据原始字符串的长度遍历所有的字符,即从第0个字符开始到最后一个字符。
  • 第二层循环是获取从第i个字符开始到最后一个字符的所有子串。每次循环加1,即切片的结束位置向前移动一个字符。
  • 判断当前切片操作的子串长度是否为n。如果是,则保存该子串到列表中。

get_sub_str函数返回的是长度为n的所有子串的列表,该列表中包含原始字符串所有可能的长度为n的子串。

获取由K种不同字符组成的所有子串

获取由K种不同字符组成的所有子串比获取所有长度为N的子串稍微要麻烦一些。我们可以先遍历原始字符串,统计K个不同字符的个数,然后使用循环嵌套的方式获取所有符合要求的子串。以下是获取由K种不同字符组成的所有子串的代码示例:

def get_kinds_sub_str(origin_str: str, k: int, n: int):
    length = len(origin_str)
    sub_str_list = []
    for i in range(length):
        char_count = {}
        for j in range(i, length):
            if origin_str[j] not in char_count:
                char_count[origin_str[j]] = 1
            else:
                char_count[origin_str[j]] += 1
            if len(char_count) > k:
                break
            if j - i + 1 == n and len(char_count) == k:
                sub_str_list.append(origin_str[i:j + 1])
    return sub_str_list

以上代码中的get_kinds_sub_str函数接受三个参数,第一个是原始字符串,第二个是不同字符的个数K,第三个是子串的长度N。该函数首先遍历原始字符串中的每个字符,然后以当前字符为起点往后遍历,统计所有不同字符的个数,当不同字符的个数超过K时退出循环。如果当前子串的长度为N且不同字符的个数为K时,将该子串保存到sub_str_list列表中并继续循环,直到遍历完原始字符串。

整合代码并进行测试

我们已经实现了获取N长度子串和获取由K个不同字符组成的所有子串的代码,下面我们来整合这些代码,并对其进行测试:

def get_sub_str(origin_str: str, n: int):
    sub_str_list = []
    length = len(origin_str)
    for i in range(length):
        for j in range(i + 1, length + 1):
            if j - i == n:
                sub_str = origin_str[i:j]
                sub_str_list.append(sub_str)
    return sub_str_list

def get_kinds_sub_str(origin_str: str, k: int, n: int):
    length = len(origin_str)
    sub_str_list = []
    for i in range(length):
        char_count = {}
        for j in range(i, length):
            if origin_str[j] not in char_count:
                char_count[origin_str[j]] = 1
            else:
                char_count[origin_str[j]] += 1
            if len(char_count) > k:
                break
            if j - i + 1 == n and len(char_count) == k:
                sub_str_list.append(origin_str[i:j + 1])
    return sub_str_list

# 测试代码
origin_str = "abcabcbdcd"
n = 3
k = 2

n_sub_str_list = get_sub_str(origin_str, n)
print(f"All {n}-length sub strings: {n_sub_str_list}\n")

kinds_sub_str_list = get_kinds_sub_str(origin_str, k, n)
print(f"All {k}-kinds sub strings: {kinds_sub_str_list}")

以上代码包含了获取长度为N的所有子串和获取由K个不同字符组成的所有子串的函数,以及测试代码。我们使用字符串”abcabcbdcd”进行测试,N设为3,K设为2。运行该代码后,控制台将输出所有长度为3的子串和所有由2种不同字符组成的子串。输出结果如下:

All 3-length sub strings: ['abc', 'bca', 'cab', 'abc', 'bcb', 'cbd', 'bcd', 'cdc', 'dcd']

All 2-kinds sub strings: ['abcb', 'bcbc']

结论

本文介绍了如何使用Python编程语言获取由K个不同字符组成的N大小子串。我们首先使用切片操作和循环嵌套的方式获取所有长度为N的子串,接着将其与K个不同字符的要求进行组合过滤,得出了所有符合要求的子串。代码简单易懂,可以方便地应用到各种Python字符串处理的场景中。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程