Python 查找字符串中重复字符的最长子字符串

Python 查找字符串中重复字符的最长子字符串,python,string,algorithm,Python,String,Algorithm,(这是研究的基础) 除非我真的,真的,被卡住了,否则我不会在代码部队问题上寻求帮助,而现在正好是 你的第一个任务是找到火星数据库的密码。为了实现这一点,你最好的特工已经发现了以下事实: 密码是由一系列非递减数字组成的给定字符串的子字符串 密码越长越好 密码始终是回文 回文是向后读取相同内容的字符串。racecar、bob和noon就是著名的例子。 鉴于这些事实,你能找到数据库所有可能的密码吗? 输入 第一行包含n,输入字符串的长度(1) ≤ N ≤ 105). 下一行包含长度为n的字符串。这个字

(这是研究的基础)

除非我真的,真的,被卡住了,否则我不会在代码部队问题上寻求帮助,而现在正好是

你的第一个任务是找到火星数据库的密码。为了实现这一点,你最好的特工已经发现了以下事实: 密码是由一系列非递减数字组成的给定字符串的子字符串 密码越长越好 密码始终是回文 回文是向后读取相同内容的字符串。racecar、bob和noon就是著名的例子。 鉴于这些事实,你能找到数据库所有可能的密码吗? 输入 第一行包含n,输入字符串的长度(1) ≤ N ≤ 105). 下一行包含长度为n的字符串。这个字符串的每个字符都是一个数字。 字符串中的数字按非降序排列。 输出 在第一行,打印可能的密码数k。 在接下来的k行中,按字母顺序打印可能的密码。 我的意见是:

  • 非递减字符串中的回文只是一个重复字符字符串(例如“4444”或“11”)

  • 在字符
    i
    上,i的最后一个实例-i+1的第一个实例=重复字符的长度

  • 跟踪最大密码长度,然后过滤掉每一个短于最大密码长度的项目,可以保证输出的密码具有最大长度

  • 基于这些观察结果,我的解决方案是:

    n,s = [input() for i in range(2)]#input
    
    maxlength = 0
    
    results = []
    
    
    for i in s:
        length = (s.rfind(i)-s.find(i))+1 
    
        if int(i*(length)) not in results and length>=maxlength:
    
            results.append(int(i*(length))) 
    
            maxlength = length 
    
    
    
    #filer everything lower than the max password length out
    results = [i for i in results if len(str(i))>=maxlength]
    
    
    #output
    print(len(results))
    
    for y in results:
        print(y)
    
    不幸的是,这个解决方案实际上是错误的,在第四个测试用例中失败了。我不明白代码出了什么问题,所以我无法修复它。有人能帮忙吗


    谢谢你的阅读

    您的程序将在以下情况下失败:

    4
    0011
    
    它将只返回
    11

    问题是
    str(int('00'))
    的长度等于1

    <>你可以通过删除<代码> int 和<代码> STR 从程序中调用(即将答案保存为字符串而不是INTS)。虽然

    似乎已经识别出了代码的问题,但是,如果您对解决此问题的不同方式感兴趣,请考虑使用正则表达式。

    import sys
    import re
    
    next(sys.stdin)             # length not needed in Python    
    s = next(sys.stdin)
    
    repeats = r'(.)\1+'
    for match in re.finditer(repeats, s):
        print(match.group())
    
    模式
    ()\1+
    将查找重复数字的所有子字符串。输入输出

    10 3445556788
    请注意,匹配的子字符串是从
    match
    对象中提取的,然后按长度降序排序。代码依赖于这样一个事实,即输入中的数字不得减少,因此不需要第二种字母顺序的候选密码。

    是b/c失败,生成错误答案,还是b/c耗时太长?您的问题基本上归结为查找给定字符串中长度>1的回文总数。如果我错了,请纠正我,如果可以,请提供一个反例。它失败了,因为它生成了错误的答案。而且,它不仅仅意味着给定字符串中长度大于1的回文,它意味着长度大于等于找到的最长回文。例如,如果我找到一个回文“44”,然后又找到另一个“77777”,我必须丢弃“44”和任何其他较短的回文,因为它不再是最大长度。幸运的是,Peter de Rivas善意地指出问题在于将答案存储为int而不是字符串! 44 555 88
    import sys
    import re
    
    next(sys.stdin)                 # length not needed in Python
    s = next(sys.stdin).strip()
    
    repeats = r'(.)\1+'
    passwords = sorted((m.group() for m in re.finditer(repeats, s)),
                        key=len, reverse=True)
    
    passwords = [s for s in passwords if len(s) == len(passwords[0])]
    
    if len(passwords) == 0:
        passwords = list(s)
    
    print(len(passwords))
    print(*passwords, sep='\n')