编写一个程序,给定一个长字符串(比如顺序为1.000.000个字符(,计算长度≥7的所有回文子串,即拼写相同的子串向前和向后读取。您可以使用以下代码将文件中的完整文本读取为字符串,将其转换为小写,并删除除字母和数字之外的所有内容。文件saxo.txt是的本地副本http://www.gutenberg.org/cache/epub/1150/pg1150.txt
from string import ascii_letters, digits
s = open("The Danish History.txt").read()
s = s.lower()
s = "".join([c for c in s if c in ascii_letters or c in digits])
def isPalindrome(str):
def isPal(str):
if len(str) >= 7:
return True
else:
str[0] == str[-1] and isPal(str[1:-1])
return isPal(s)
print(isPalindrome(s))
我在这个练习中计算了一个文本文件中长度≥7的所有回文子串。我已经用上面的代码来表明我的字符串/文本文件是一个回文。我不知道我现在要做什么来计算长度≥7的所有回文子串的列表。
提前谢谢。
只要单词的长度大于或等于7,无论它是回文,函数都将返回True
。您可以检查字符串的反转版本是否与原始字符串相同:string[::-1] == string
就足够了。
在我看来;回文子串";并不意味着回文单词。在这种情况下,您可能希望在所有子字符串上循环,而不仅仅是用空格分隔的单词。可能有更有效的方法来做到这一点,但以下是我的建议:
from string import ascii_letters, digits
with open('The Danish History.txt', 'r') as f:
s = f.read()
s = s.lower()
s = "".join([c for c in s if c in ascii_letters or c in digits])
palins = []
for length in range(7, len(s) + 1): # loop over possible lengths
for start in range(len(s) - length): # loop over starting positions
substring = s[start:start+length]
if substring[::-1] == substring: # if palindromic
palins.append(substring)