从 find_all_palindromes 函数创建 longest_palindrome 函数

Making a longest_palindrome function from a find_all_palindromes function

我想做一个函数来打印大量文本的最长回文子串。 我已经编写了一个代码来查找文本的所有回文。 现在我想让它只打印最长的一个。但它不起作用。 有人可以帮忙吗?

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

工作

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

您可以使用的一种解决方案是将所有回文附加到列表 palindromes.append("word"),然后使用 list comprehension 计算它们的长度,并使用 [=17] 从列表中打印出回文长度=] 函数,它找到最大值。

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")

运行 产生

aabbbaa

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

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")

执行此操作的方法之一是维护一个列表。但是,此列表在任何给定时间都只会存储 1 个字符串。因此,每次调用 find_palindrome_substr() 时,都会检查新生成的字符串是否比列表中已存在的字符串长。如果是,则用新字符串替换列表中的字符串。除第一次调用外,当列表为空时,您无条件地将单词附加到它。代码看起来像这样:

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"))

输出:

aabbbaa