【问题标题】:Need to find all palindromes of a specific length需要找到特定长度的所有回文
【发布时间】:2013-07-18 22:57:56
【问题描述】:

给定一个字符串,我需要在该序列中找到特定长度的所有回文的索引,然后将该索引打印在回文长度旁边。

例如,如果我想要 4 个字符长的回文:

seq = 'abbacdefggfhijkkjlmn' 

最佳读数是:

[(0,4), (7,4), (13,4)]

我写了一个函数来做这个,但是我有一个小故障。它返回正确的数据集,但它会一遍又一遍地返回它,次数与序列长度一样多。例如,给定上面的序列,它将返回数据集 20 次:

def find_palindromes(seq,y):
L = len(seq)
res = []
for x in seq:
    x=0
    while x<= L-y:
        if seq[x:x+y] == reverse(seq[x:x+y]):
            res.append((x,y))
        x=x+1
return res

对于我的故障的任何见解将不胜感激。我知道这可能不是最有效的做事方式,但我非常新,只是想弄湿自己的脚。

【问题讨论】:

  • 请修正代码中的缩进
  • 您正在循环使用for 循环x,然后重新分配x 并对其执行while 循环。如果您删除 for x in seq 行然后修复缩进,您可能会得到您想要的。

标签: python palindrome


【解决方案1】:

您的 for 循环每次都从 0 开始,因此您实际上执行此操作的次数与 seq 中的字符数一样多。 while 循环本身就足够了——你需要做的就是遍历序列一次。所以(正如 2rs2ts 的评论所说)只需删除 for x in seq 行。

这是非常简单的解决方法:稍微更激进的方法是将您的 while 循环切换到 for x in range(0, L-y): 循环。

另外:代码中不是函数头的所有内容都应该缩进,以便 Python 知道它在函数内部。

【讨论】:

  • 感谢您的帮助。对此,我真的非常感激。这很有意义,它立即解决了问题。
【解决方案2】:

这是一个适合您需要的 1 行表达式:

def find_palindromes(seq,y):
  return [(seq.index(seq[x:x+y]),y) for x in range(len(seq)-y) if seq[x:x+y] == seq[x:x+y][::-1]]

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多