在大文本中查找回文

时间:2019-02-10 12:38:35

标签: python palindrome

因此,我们获得了一个带有约60万个字符的文本,其中没有“空格”和句号。我已将其从文本中删除。现在,我要在该文本中找到所有长度大于7的回文,我需要一些帮助来完成该工作。

我已经尝试过一件事,但是那太慢了。

from string import ascii_letters, digits

s = open("pg1150.txt").read()
s = s.lower()
s = "".join([c for c in s if c in ascii_letters or c in digits])
for i in range(len(s)):
    for j in range(i + 6, len(s) + 1):
        t = s[i:j]
        if t == t[::-1]: 
            print(t)

输入文本为:http://www.gutenberg.org/cache/epub/1150/pg1150.txt

1 个答案:

答案 0 :(得分:2)

请注意,如果字符串s 0 ... s n 是回文,则s 1 ... s n-1 也是回文

简而言之,遍历文件,搜索长度为7和长度为8的每个有效回文(感谢@tobias_k指出,否则,您只会得到奇数回文),但是除了将其打印之外,还将其索引保存到a单独的列表。

for i in range(len(s) - 8):
    t1 = s[i:i+7]
    t2 = s[i:i+8]

    if t1 == t1[::-1]: 
        index_table.append(i)
    if t2 == t2[::-1]: 
        index_table.append(i)

#You have to ensure that the only substring of length 7 that goes unchecked isn't a palindrome
if s[-7:] == s[-7:][::-1]:
    index_table.append(len(s) - 7)

现在您已经拥有了所有将来回文的“基础”,可以很容易地使用前面提到的递归关系来构造所有其他回文。

for i in index_table:
    n = 0
    while (s[i-n] == s[i+6+n]):
        print(s[i-n:i+6+n])