【问题标题】:Count the number of Substrings which are Palindromes计算回文子串的数量
【发布时间】:2015-01-05 06:59:25
【问题描述】:

我目前正在尝试解决 Hackerreank 上的一个编程问题(链接在这里 -> https://www.hackerrank.com/challenges/count-palindromes)。

问题将字符串定义为由小写字符(a 到 z)组成

K 是我作为输入提供的数字

我应该找到包含 K 个回文子串的最小字符串(上面的定义)。 (回文是一个序列,当反转时会给出相同的序列)。

好的,这是有道理的。现在,这是我的方法

假设我有一个字符串“aaaa”,它有 10 个回文子串的形式 一个,一个,一个,一个 啊啊啊啊啊啊 啊啊啊啊 啊啊啊 (因为不同索引的字符被认为是唯一的。)

所以如果 K 被给定为 10,那么具有 10 个回文子串的字符串的最小长度是 4。因此答案是 4(这个细节也可以在链接上找到)

现在我有一种方法可以解决这个问题,但它并没有给我正确的结果。

假设子串长度为N,如果它包含所有相同的字符,我将获得N的最小可能值

如果我假设这个,那么数量:

大小 1 回文子串 = N

大小为 2 的回文子串 = N-1

大小为 3 的回文子串 = N-2

..

..

..

大小 N 回文子串 = 1

使用此代码可以计算回文子串的数量

index = N
total = 0
while N > 0:
    total += N   
    N-=1

一步一步,这段代码只是计算从1到N的自然数之和

因此 (N * N+1) / 2 是一个数字可以拥有的回文子串的数量。因此对于一个特定的 N,is (N * N+1) / 2 等于 K,那么 N 就是答案。

现在一个样例输入 K 是 17

但是 N * N+1 / 2 永远不会给出 N(自然数)

谁能告诉我方法中的错误是什么。感谢所有帮助:) 很抱歉这个长问题

P.S : 我真的不需要解决这个问题,我只是想弄清楚我的算法出了什么问题

【问题讨论】:

    标签: python string algorithm palindrome


    【解决方案1】:

    求和的公式既不是 (N * N+1)/2 也不是 N * N+1 / 2。 正确的公式是 (N*(N+1))/2。这始终是一个自然数,因为 N 或 (N+1) 都是偶数。因此,(N*(N+1)) 是偶数,(N*(N+1))/2 是自然数。

    【讨论】:

    • 当我说 N*N+1 /2 时,我的意思是它是 (N*(N+1))/2。对不起 :) 。我的意思是说,当 K 为 17 时,我无法得出整数 N 值
    【解决方案2】:

    您的方法是错误的,因为您试图计算字符串中所有子字符串的数量。 “假设子字符串长度为 N,如果它包含所有相同的字符,我将获得 N 的最小可能值”。这就是错误所在。由于分布 N*(N+1)/2 不涵盖整个自然数系统集,因此他们可能会要求 K 的多个值,而您无法涵盖它。 17 就是这样的值。

    aaaa -> it has 10 palindrome substrings.
    aaaaa -> it has 15 palindrome substrings.
    aaaaaa -> it has 21 palindrome substrings.
    

    如您所见,回文子串的数量从 N = 5 的 15 个跃升至 N = 6 的 21 个。因此,像 HAVING EXACTLY 17 palindrome substrings 这样的事情不可能用只有一个字符的字符串来表示。

    但是,如果您巧妙地适当地添加另一个字母(或几个字母),您可以改变这种情况。例如

    aaaaabb -> it has 18 palindrome substrings. ( Added b,b,bb)
    

    希望它能给你一些指导。我自己还没有想出答案,但我认为诀窍在于将字母添加到一个字符的原始字符串中,因为上面的示例(顺便说一句)也使用了最小字符串。

    另一个例子:

    aaaaabbc -> (minimum ?) string that has EXACTLY 19 palindrome substrings.
    

    祝你好运:)

    【讨论】:

    • 谢谢。我明白我的逻辑错误在哪里。我太专注于减少 N,以至于忘记考虑其他因素。我很快就会想出一个算法;)。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多