首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从longest_palindrome函数生成find_all_palindromes函数

从longest_palindrome函数生成find_all_palindromes函数
EN

Stack Overflow用户
提问于 2020-04-24 09:21:42
回答 3查看 121关注 0票数 0

我想要创建一个函数,打印大量文本中最长的回文子字符串。我已经做了一个代码来查找文本的所有回文。现在我想让它只打印最长的一个。但不起作用。有人能帮忙吗?

代码语言:javascript
复制
def find_palindrome_substr(string, left, right):
 while left >= 0 and right <len(string):
  if string[left] != string[right]:
   break
  print string[left: right+1]
  left -=1 #expand to left
  right +=1 #expand to right

def find_all_palin(string):
  for i in xrange(0, len(string)):
   find_palindrome_substr(string, i-1, i+1)
   find_palindrome_substr(string, i, i+1)

find_all_palin("aabbbaa")

如何使此代码只打印最长的回文子字符串?我在python工作3.7

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-24 09:35:32

我冒昧地将print更改为print(),将xrange更改为range,以便它在python 3上工作。

您可以使用的一个解决方案是将所有回文添加到一个列表palindromes.append("word")中,然后用列表理解计算它们的长度,然后用max()函数从列表中打印出其中的一个,该函数找到最大的值。

代码语言:javascript
复制
palindromes = []

def find_palindrome_substr(string, left, right):
    while left >= 0 and right <len(string):
        if string[left] != string[right]:
            break
        palindromes.append(string[left: right+1])
        left -=1 #expand to left
        right +=1 #expand to right

def find_all_palin(string):
    for i in range(0, len(string)):
        find_palindrome_substr(string, i-1, i+1)
        find_palindrome_substr(string, i, i+1)
    len_palindromes = [(len(palindrome), palindrome) for palindrome in palindromes]
    print(max(len_palindromes)[1])

find_all_palin("aabbbaa")

运行产生

代码语言:javascript
复制
aabbbaa
票数 0
EN

Stack Overflow用户

发布于 2020-04-24 09:46:44

您目前正在打印您找到的所有回文。相反,您希望将它们存储在列表中,以便以后可以检查其中哪一个最长。

代码语言:javascript
复制
def find_palindrome_substr(string, left, right):
  palindromes = list()
  while left >= 0 and right <len(string):
    if string[left] != string[right]:
       break
    palindromes.append(string[left: right+1])
    left -=1 #expand to left
    right +=1 #expand to right
  return palindromes

def find_longest_palin(string):
   all_palindromes = list()
   for i in xrange(0, len(string)):
     all_palindromes.extend(find_palindrome_substr(string, i-1, i+1))
     all_palindromes.extend(find_palindrome_substr(string, i, i+1))

   # get lengths of each palindrome we found
   lengths_palindromes = [len(pal) for pal in all_palindromes]

   # find the index of the longest palindrome
   index_longest_palindrome = lengths_palindromes.index(max(lengths_palindromes))

   # print longest palindrome
   print all_palindromes[index_longest_palindrome]
find_longest_palin("aabbbaa")
票数 0
EN

Stack Overflow用户

发布于 2020-04-24 09:49:10

您可以这样做的方法之一是通过维护一个列表。但是,这个列表在任何给定的时间只存储一个字符串。因此,每次调用find_palindrome_substr()时,都会检查新生成的字符串是否长于列表中已经存在的字符串。如果是,将列表中的字符串替换为新字符串。除了第一个调用之外,当列表为空时,您无条件地将单词追加到其中。代码应该如下所示:

代码语言:javascript
复制
def find_palindrome_substr(string, left, right, palinList):
 while left >= 0 and right <len(string):
  if string[left] != string[right]:
   break

  thisPalin = string[left: right + 1] 
  if(len(palinList) == 0):
    palinList.append(thisPalin)
  else:
    if(len(palinList[0]) < len(thisPalin)):
        palinList.pop()
        palinList.append(thisPalin)

  left -=1 #expand to left
  right +=1 #expand to right

def find_all_palin(string):
  palinList = []
  for i in range(0, len(string)):
   find_palindrome_substr(string, i-1, i+1, palinList)
   find_palindrome_substr(string, i, i+1, palinList)

  return palinList[0]

print(find_all_palin("aabbbaa"))

产出:

代码语言:javascript
复制
aabbbaa
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61405076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档