如何以最小的班次制作一个回文?

时间:2017-04-20 18:10:18

标签: string algorithm palindrome

我给了一个字符串,例如aaabb,我必须把它变成一个具有最小移位数的回文,我应该用什么算法来实现呢? https://www.hackerrank.com/contests/sample-1-1/challenges/cyclic-palindrome

请不要使用仅代码算法

2 个答案:

答案 0 :(得分:1)

创意1:

您可以使用多项式哈希来计算O(1)中移位字符串的哈希值,使用前缀字符串的哈希值作为初始字符串及其反转版本。之后,您需要检查这两个哈希是否相等。您可以测试所有可能的班次并选择最适合的班次(总时间复杂度为O(N))。

创意2:

让我们写两次字符串。我们需要找到至少N个字符的回文。您可以使用Manacher的算法在线性时间内找到所有这些回文并选择与最小班次相对应的回文。

这两个解决方案都具有线性时间复杂度,但第一个解决方案稍微容易编码,而第二个解决方案保证适用于所有可能的输入,因为它不依赖于缺少哈希冲突。

答案 1 :(得分:0)

在回文字符串中注意到的有趣的事情是最多可以有一种奇数频率的字符。即,abcccba a(2)b(2)c(3)。 因此在扫描字符串时,保持字符数。如果odd_count> 1,打印-1 如果odd_count = 1,你需要将这种类型的字符保留在中间,所以移动字符串最小时间(左移或右移)并检查它是否形成回文。 如果odd_count = 0,则需要移位并检查。