不懂后缀数组的先仔细看这里:
1. 最长公共前缀(LCP,Longest Common Prefix)的后缀数组解法:构建SA[i]数组中相邻元素的最长公共前缀(LCP,Longest Common Prefix),Height[i]表示SA[i]和SA[i-1]的LCP;如果需要求解string中的后缀子串 suffix[i] 和suffix[j]的LCP,则通过Rank数组取得两个后缀的排名m和n ( m < n ),则Height数组在m+1和n之间的最小值就是目标的LCP,这里套个RMQ算法就可以了。
2.最长回文子串(LPS,Longest Palindrome Substring)的后缀数组解法:如求字符串abcddcef的LPS,则将原字符串翻转并在前面加上\(*\) (一般是$)字符,最后连接到源字符串末尾变成abcddcef \(*\) fecddcba,所以LPS转换为求新字符串某两个suffix子串的最长公共前缀。
3.最长公共子串(LCS,Longest Common Substring)的后缀数组解法:最长公共子串指的是字符必须靠在一起的子串,不同于最长公共子序列;一种解法是动态规划(Dynamic Programming),时间复杂度为O(N^2);一种解法是KMP算法,时间复杂度为O(N^2);一种解法是后缀数组解法,时间复杂度为O(NlogN);如求字符串S1:abcdefg和字符串S2:kgdefac的LCS,将S2前面加上\(*\) (一般是$)字符并连接到S1末尾变成abcdefgaa \(*\) kgdefac,则LCS也转换为求新字符串中某两个suffic子串的最长公共前缀,但是这两个子串的起始位置必须在\(*\)前后。
<br>
<br> <br>