我给出了像abca
这样的词。我想知道我需要添加多少个字母以使其成为回文。
在这种情况下它是1,因为如果我添加b,我得到abcba
。
答案 0 :(得分:6)
首先,让我们考虑一个低效的递归解决方案:
假设字符串的格式为aSb
,其中a
和b
为字母,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
字符串修改而不是更多。