对于给定的int序列,检查双回文的数量,其中双回文是指两个相同的回文序列,它们之间没有断裂。例如:
in 1 0 1 1 0 1我们有1 0 1作为回文,出现2次不间断,
in 1 0 1 5 1 0 1我们有1 0 1但它是分开的
(除了这些序列中的其他回文)
问题示例测试数据是:
3
12 0 1 1 0 0 1 1 0 0 1 1 0
12 1 0 1 0 1 0 1 0 1 0 1 0
6 3 3 3 3 3 3
带答案
8 0 9
Manacher对于乞讨是显而易见的,但我不知道接下来该做什么。任何想法都赞赏。复杂度应低于n ^ 2我猜。
编辑:int在此被视为字母的单个元素
答案 0 :(得分:0)
我将从2个集合开始:
算法的工作原理如下:
事实上,生长序列是一次可能成为回文序列的序列,而收缩序列则是“部分”回文序列。
答案 1 :(得分:0)
由于您已经知道找到所有回文的算法(BTW非常棒),您需要做的就是以下几点。请注意,“双回文”也是回文:
反向(PP)=反向(P)反向(P)= PP。
所有回文(a,b)
中找到((a,b)
我指的是从a
位置到b
位置的回文),你需要找到(i,j,k)
} (i,j)
,(j,k)
和(i,k)
都是回文,j-i=k-j
。同样,对于您找到的每个回文(i,j)
,您只需设置k = 2j-i
,并检查(k,j)
和(i,k)
是否为回文。
如果第一步总共返回M个回文,则需要O(M)时间(假设你存储它们以便检查是否存在回文是O(1)),所以O(n 2 )在最坏的情况下。我认为在最坏的情况下这应该是最佳的(考虑所有1的字符串)。