计算Palindromes的子串数

时间:2014-11-08 15:51:27

标签: python string algorithm palindrome

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

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

组成

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

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

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

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

因此,如果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,(N * N + 1)/ 2等于K,那么N就是答案。

现在样本案例输入K是17

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

任何人都能说出我的方法中的错误。所有的帮助表示赞赏:)并抱歉这个长期的问题

P.S:我真的不需要问题的解决方案,我只是想弄清楚我的算法有什么问题

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的方法是错误的,因为您正在尝试计算字符串中所有子字符串的数量。 "假设子串长度为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.

正如你所看到的,回文子串的数量从15开始,N = 5到21,N = 6.因此,只有一个字符的字符串不能表示像17个回文子串一样。

但是,如果你巧妙地添加另一个字母(或几个字母),你可以改变这种情况。 E.g。

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

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

另一个例子:

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

G00d运气:)