可以通过这种方式找到线性解决方案::
先决条件:
(1).你必须知道如何在 O(N) 或 O(NlogN) 时间内构造后缀数组。
(2).您必须知道如何找到标准 LCP 阵列,即。相邻后缀 i 和 i-1 之间的 LCP
即。 LCP[i]=LCP(排序数组后缀i,排序数组后缀i-1)为(i>0)。
令 S 为原始字符串,S' 为原始字符串的反面。
让我们以 S="banana" 为例。
然后它的反向字符串 S'=ananab。
第 1 步:连接 S + # + S' 得到 String Str ,其中 # 是原始字符串中不存在的字母。
Concatenated String Str=S+#+S'
Str="banana#ananab"
第二步:现在构造字符串Str的后缀数组。
在本例中,后缀数组为:
Suffix Number Index Sorted Suffix
0 6 #ananab
1 5 a#ananab
2 11 ab
3 3 ana#ananab
4 9 anab
5 1 anana#ananab
6 7 ananab
7 12 b
8 0 banana#ananab
9 4 na#ananab
10 10 nab
11 2 nana#ananab
12 8 nanab
请注意,后缀数组是一个整数数组,它按字典顺序给出字符串后缀的起始位置。因此,保存起始位置索引的数组是后缀数组。
即SuffixArray[]={6,5,11,3,9,1,7,12,0,4,10,2,8};
第 3 步:由于您已经成功构建了后缀数组,现在找到相邻后缀之间的最长公共前缀。
LCP between #ananab a#ananab is :=0
LCP between a#ananab ab is :=1
LCP between ab ana#ananab is :=1
LCP between ana#ananab anab is :=3
LCP between anab anana#ananab is :=3
LCP between anana#ananab ananab is :=5
LCP between ananab b is :=0
LCP between b banana#ananab is :=1
LCP between banana#ananab na#ananab is :=0
LCP between na#ananab nab is :=2
LCP between nab nana#ananab is :=2
LCP between nana#ananab nanab is :=4
因此 LCP 数组 LCP={0,0,1,1,3,3,5,0,1,0,2,2,4}。
其中 LCP[i]=后缀 i 和后缀 (i-1) 之间的最长公共前缀长度。 (对于 i>0)
第 4 步:
现在你已经构建了一个 LCP 数组,使用以下逻辑。
Let the length of the Longest Palindrome ,longestlength:=0 (Initially)
Let Position:=0.
for(int i=1;i<Len;++i)
{
//Note that Len=Length of Original String +"#"+ Reverse String
if((LCP[i]>longestlength))
{
//Note Actual Len=Length of original Input string .
if((suffixArray[i-1]<actuallen && suffixArray[i]>actuallen)||(suffixArray[i]<actuallen && suffixArray[i-1]>actuallen))
{
//print :Calculating Longest Prefixes b/w suffixArray[i-1] AND suffixArray[i]
longestlength=LCP[i];
//print The Longest Prefix b/w them is ..
//print The Length is :longestlength:=LCP[i];
Position=suffixArray[i];
}
}
}
So the length of Longest Palindrome :=longestlength;
and the longest palindrome is:=Str[position,position+longestlength-1];
执行示例::
actuallen=Length of banana:=6
Len=Length of "banana#ananab" :=13.
Calculating Longest Prefixes b/w a#ananab AND ab
The Longest Prefix b/w them is :a
The Length is :longestlength:= 1
Position:= 11
Calculating Longest Prefixes b/w ana#ananab AND anab
The Longest Prefix b/w them is :ana
The Length is :longestlength:= 3
Position:=9
Calculating Longest Prefixes b/w anana#ananab AND ananab
The Longest Prefix b/w them is :anana
The Length is :longestlength:= 5
Position:= 7
So Answer =5.
And the Longest Palindrome is :=Str[7,7+5-1]=anana
只需记下::
第 4 步中的 if 条件基本上是指,在每次迭代(i) 中,如果我取后缀 s1(i) 和 s2(i-1) 则 ,"s1 必须包含 # 和s2 不能包含 #" OR
"s2 必须包含#,s1 不能包含#"。
|(1:BANANA#ANANAB)|leaf
tree:|
| | | |(7:#ANANAB)|leaf
| | |(5:NA)|
| | | |(13:B)|leaf
| |(3:NA)|
| | |(7:#ANANAB)|leaf
| | |
| | |(13:B)|leaf
|(2:A)|
| |(7:#ANANAB)|leaf
| |
| |(13:B)|leaf
|
| | |(7:#ANANAB)|leaf
| |(5:NA)|
| | |(13:B)|leaf
|(3:NA)|
| |(7:#ANANAB)|leaf
| |
| |(13:B)|leaf
|
|(7:#ANANAB)|leaf