我目前正在尝试解决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:我真的不需要问题的解决方案,我只是想弄清楚我的算法有什么问题答案 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运气:)