【问题标题】:Python Iterating through a string to look for a PalindromePython遍历字符串以查找回文
【发布时间】:2017-04-22 17:18:19
【问题描述】:

所以我在这个网站和其他网站上查看了有关如何在 Python 上遍历字符串、找到特定子字符串、反转它并检查两者是否相等以获得回文的信息。这就是问题所在,因为某些测试用例很难获取,并且让我对如何通过索引找到它们感到困惑。

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

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

此代码适用于以下回文:“racecar”、“”和“abqc”。 它不适用于这些回文“aaaa”和“abacccaba”。

对于“aaaa”,有 6 个回文,对于“abacccaba”,有 8 个回文。这就是我的问题发生的地方,我根本无法弄清楚。对于“aaaa”的 6 个回文,我得到 aaaa,aaa,aa,每个回文两次。对于“abacccaba”,我不知道 abacccaba、bacccab、acca、ccc、aba、aba 的 8 个回文。

我知道这是一个令人困惑的问题,但我不知道如何解决这个问题,因为我只得到 2 的“aaaa”和 4 的“abacccaba”。有什么想法可以删除子字符串并获取这些值吗?

提前致谢!

【问题讨论】:

    标签: python-2.7


    【解决方案1】:

    while firstindex != lastindex and firstindex &lt;= lastindex: 漏掉了单个字符回文的情况。

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

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

    aaaa
    a
     a
      a
       a
    aa
     aa
      aa
    aaa
     aaa
    

    如果单字符回文不算数,那么我们有 6 个。

    无论哪种方式,您都需要将所有子字符串视为可能的回文;不仅仅是中间的那些。在 Python 中将字符串与其反转的 self 进行比较非常容易: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)]
    

    过滤掉长度

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

    【讨论】:

    • 好的,所以我不是唯一一个注意到缺少一些总数的人。我应该提到它们必须大于 2,但仍有一些缺失。不幸的是,这是在那些代码运行器的事情之一上,所以预期的输出就是我需要的。我会查看您提供的内容并解决它以使测试用例正确,谢谢!
    • 还有一点:while firstindex != lastindex and firstindex &lt;= lastindex:可以简化为while firstindex &lt; lastindex:
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多