马拉车算法 java

Manacher

package Manacher;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	
	
	public static char[] manacherString(String str) {
		char[] charArr = str.toCharArray();
		char[] res = new char[str.length()*2+1];
		int index = 0;
		for (int i = 0; i < res.length; i++) {
			res[i] = (1 & i) == 0 ?'#':charArr[index++];
		}
		return res;
	}
	
	
	public static int maxLcpsLength(String str) {
		if(str == null||str =="") {
			return 0;
		}
		
		char[] charArr = manacherString(str);
		int[] pArr = new int[charArr.length];
		int c = -1;
		int R = -1;
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < pArr.length; i++) {
			pArr[i] = i < R ? Math.min(pArr[2*c-i], R-i) : 1;
			
			while(i+pArr[i]<pArr.length&&i-pArr[i]>-1) {
				if(charArr[i+pArr[i]]==charArr[i-pArr[i]]) {
					pArr[i]++;
				}else {
					break;
				}
			}
			
			if(i+pArr[i]>R) {
				R = i+pArr[i];
				c = i;
			}
			
			max = Math.max(max, pArr[i]);
		}
		return max;

	}

}

猜你喜欢

转载自blog.csdn.net/qq_40674583/article/details/87887197