我想制作一个函数,打印大量文本中最长的回文子字符串。我已经制作了一个代码来查找文本的所有回文。现在我想让它只打印最长的一个。但它不起作用。有人能帮忙吗?
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")
中,然后通过列表理解计算它们的长度,并使用max()
函数从列表中打印出一个回文,该函数可以找到最大值。
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