【问题标题】:Find the largest possible substring with k unique letters. (recursive)找到具有 k 个唯一字母的最大可能子串。 (递归)
【发布时间】:2020-04-10 09:32:14
【问题描述】:

我正在尝试使用 k 个唯一字母找到可能的最大子字符串。有没有办法可以通过字符串分区进行递归? 我的想法是通过剪切最后一个字符来分割一个字符串,如果我找到包含 k 个唯一字母的第一个子字符串,我会返回它。

For example k = 2, string = "abccd"
abccd ->
abcc, bccd ->
abc,bcc,bcc,ccd -> return bcc
def unique_l(sub, k):
    u=0
    visited = set()
    for ch in sub:
        if ch not in visited:
            visited.add(ch)
            u += 1

    if u < k:
        return -1
    elif u == k:
        return 1
    else:
        return 0


def find_sub(string,k):

    if unique_l(string,k) == 1:
        return string
    if unique_l(string,k) == -1:
        return "Not Found"

    find_sub(string[0:len(string)-1],k) # Left
    find_sub(string[1:len(string)],k) # Right

我知道我可以使用迭代在 O(n) 时间内完成,但有没有办法递归?

【问题讨论】:

    标签: python string recursion substring


    【解决方案1】:

    您可以将递归与生成器一起使用:

    from collections import Counter
    def group(d, k):
      for i in range(len(d)):
        for b in range(i, len(d)):
           if len(set((_r:=d[i:b]))) == k:
              yield _r
           yield from group(_r, k)
    
    
    r = max(group("abccd", 2), key=len)
    

    输出:

    'bcc'
    

    【讨论】:

    • 我不确定这个 _r:=d[i:b] 和 yield statment 是如何工作的
    • @no1special _r:=d[i:b] 是一个assignment expression。本质上,它可以在没有明确定义的范围内创建新名称。 yield 是生成器的一部分,它通过访问内存中指向的值来动态生成值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2021-08-12
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多