Python迭代字符串以查找回文

时间:2016-12-07 16:47:19

标签: python-2.7

所以我浏览了这个网站和其他人,了解如何在Python上迭代字符串,查找特定的子字符串,反转它并检查两者是否相等以获得Palindrome。这是问题,因为一些测试用例很难获得并且让我对如何通过索引找到它们感到困惑。

这是我的代码,适用于所有人,但有两个测试用例:

def countPalindromes(s):
    count = 0
    firstindex = 0
    lastindex = len(str)-1
    while firstindex != lastindex and firstindex <= lastindex:
        ch1 = s[firstindex:lastindex]
        ch2 = s[lastindex:firstindex:-1]
        if ch1 == ch2:
            count +=1
        firstindex +=1
        lastindex -=1
    return count

此代码适用于以下Palindromes:&#34; racecar&#34;,&#34; &#34;和&#34; abqc&#34;。 它不适用于这些Palindromes&#34; aaaa&#34;和&#34; abacccaba&#34;。

对于&#34; aaaa&#34;有6个回文和#34; abacccaba&#34;有8个回文。这就是我的问题发生的地方,我根本无法解决这个问题。对于&#34; aaaa&#34;的6个回文我得到aaaa,aaa,aa,每次两次。对于&#34; abacccaba&#34; 8个回文我不知道,因为我得到了abacccaba,bacccab,accca,ccc,aba,aba。

我知道这是一个令人困惑的问题,但是我很难解决这个问题,因为我只得到了#34; aaaa&#34;和#34; abacccaba&#34;。有什么想法我会如何删除子串并得到这些值?

提前致谢!

2 个答案:

答案 0 :(得分:1)

while firstindex != lastindex and firstindex <= lastindex:错过了单个字符回文的情况。

您还错过了aa包含三个回文,0:1,0:2和1:2的情况。

我认为你错过了aaaa的一些回文;有10:

aaaa
a
 a
  a
   a
aa
 aa
  aa
aaa
 aaa

如果单字符回文不计算,那么我们就有6.

无论哪种方式,您都需要将所有子串视为可能的回文;不仅是中间人。在Python中很容易比较字符串与反向自我:s == s[::-1]

Getting all the substrings is easy too

def get_all_substrings(input_string):
    length = len(input_string)
    return [input_string[i:j+1] for i in range(length) for j in range(i,length)]

并过滤掉长度为&lt; 2也很容易:

substrings = [a for a in get_all_substrings(string) if len(a) > 1]

将这些结合起来应该是相当直接的:

len([a for a in get_all_substrings(string) if len(a) > 1 and a == a[::-1]])

答案 1 :(得分:0)

我认为你应该单独写一个函数(f)来检查字符串是否是回文。

然后创建一个选择字母子串的函数(g)。

例如:在字符串abcd中,g将选择a,b,c,d,ab,bc,cd,abc,bcd,abcd。然后分别在每个字符串上应用f以获得回文数。