在python中递归查找给定字符串的所有子字符串

时间:2018-10-25 10:29:30

标签: python string function recursion substring

给出字符串“ lion”应得到以下子字符串输出, [“ ion”,“ lin”,“ in”,“ io”,“ li”,“ on”,“ lion”]

这是我到目前为止所拥有的,

def Substring(n):
   sub = [n]
   if len(n) > 2:
       sub.extend(Substring(n[1:]))
       sub.extend(Substring(n[:-1]))
   return list(sub)

我当前的输出是['lion','ion','on','io','lio','io','li']

我缺少子字符串“ lin”和“ in”,我不应该有“ lio”。

如果我需要其他方法或需要其他语句,我无法弄清楚吗?

3 个答案:

答案 0 :(得分:0)

您可以在可能的子字符串的每个长度上使用itertools.combinations

from itertools import combinations

def substring_combinations(s, min_length):
    result = []

    # Check that minimum length is valid
    if not min_length:
        return result

    # For each possible length append all substring combinations
    for i in range(min_length, len(s)+1):
        for combination in combinations(s, i):
            result.append(''.join(combination))

    return result

>>> print(substring_combinations('lion', 2))
['li', 'lo', 'ln', 'io', 'in', 'on', 'lio', 'lin', 'lon', 'ion', 'lion']

在您的示例中,我想您会错过一些有效的选项。
我函数中的每个输出都是lion的子字符串。

答案 1 :(得分:0)

有一个单行代码,不需要itertools。根据您的习惯,它可能会或多或少清晰易懂。

tuple(s[i:i+j+1] for i in range(len(s)) for j in range(len(s)-i))
# ('l', 'li', 'lio', 'lion', 'i', 'io', 'ion', 'o', 'on', 'n')

请注意,tuple类型仅用于打印;没有它,Python会为您提供一个生成器,如果您对其进行迭代,效率会更高。

对于长度为2或更大的子字符串:

tuple(s[i:i+j+1] for i in range(len(s)) for j in range(1, len(s)-i))
# ('li', 'lio', 'lion', 'io', 'ion', 'on')

答案 2 :(得分:0)

这是不涉及使用任何特殊库的解决方案。
基本思路:
查看字符串的第一个字符。可能的子字符串可以包含它,也可以错过它。

def get_all_substrings_recursively(s):
    if len(s) == 0:
        return ['']
    # recursive call to get all substrings of s without first char
    substrings = get_all_substrings_recursively(s[1:])
    # return all substrings with and without the first char of s
    return [(s[0] + substr) for substr in substrings] + substrings
相关问题