马拉车算法
马拉车算法是一种寻找给定字符串中的最长回文子串的方法,时间复杂度为 O(n) 。它除了可以解决“最长回文子串”的问题,还能解决由此变形的一些衍生问题,如“最短回文串”
这里是马拉车算法的详述:
一文让你彻底明白马拉车算法
LeetCode-5.最长回文子串
这里是题目描述:LeetCode-5.最长回文子串
O(n)时间复杂度马拉车算法:
马拉车算法解决的就是这个问题,因此不再做详述
马拉车算法题解代码:
class Solution {
//马拉车算法
public String longestPalindrome(String s) {
String T=preProcess(s);
int[] P=new int[T.length()];
int c=0,r=0;
for(int i=1;i<T.length()-1;i++)
{
int i_mirror=2*c-i;
if(r>i)
{
P[i]=Math.min(r-i,P[i_mirror]); //防止超出r
}
else
{
P[i]=0; //r==i的情况
}
//碰到之前讲的三中情况,需要使用中心扩展法
while(T.charAt(i+1+P[i])==T.charAt(i-1-P[i]))
{
P[i]++;
}
//判断是否需要更新r
if(i+P[i]>r)
{
c=i;
r=i+P[i];
}
}
//找出P的最大值
int maxLen=0;
int centerIndex=0;
for(int i=0;i<P.length;i++)
{
if(maxLen<P[i])
{
maxLen=P[i];
centerIndex