从给定的单词做回文

时间:2012-07-11 14:01:21

标签: algorithm

我给出了像abca这样的词。我想知道我需要添加多少个字母以使其成为回文。 在这种情况下它是1,因为如果我添加b,我得到abcba

2 个答案:

答案 0 :(得分:6)

首先,让我们考虑一个低效的递归解决方案:

假设字符串的格式为aSb,其中ab为字母,S为子字符串。

如果a==b,则f(aSb) = f(S)

如果a!=b,则需要添加一封信:最后添加a,或在前面添加b。我们需要尝试两者,看看哪个更好。所以在这种情况下,f(aSb) = 1 + min(f(aS), f(Sb))

这可以使用递归函数来实现,该函数需要指数时间才能运行。

要提高性能,请注意只能使用原始字符串的子字符串调用此函数。只有O(n ^ 2)个这样的子串。所以通过memoizing这个函数的结果,我们减少了O(n ^ 2)所花费的时间,代价是O(n ^ 2)空间。

答案 1 :(得分:0)

基本算法如下所示:

  • 迭代字符串的一半并检查字符是否存在于另一端的适当位置(即,如果您有abca,则第一个字符为a,字符串也结束与a)。
    • 如果匹配,则继续下一个字符。
    • 如果它们不匹配,请注意需要添加一个字符。

请注意,只有在字符匹配时才能从末尾移动后缀。例如,如果字符串为abcdeffeda,则外部字符匹配。然后我们需要考虑bcdeffed。外部字符不匹配,因此需要添加b。但我们不想继续cdeffe(即删除/忽略两个外部字符),我们只需删除b并继续查看cdeffed。类似地,对于c,这意味着我们的算法返回2字符串修改而不是更多。