12、Manacher

Manacher

Manacher算法解决的问题
字符串str中,最长回文子串的长度如何求解?
如何做到时间复杂度O(N)完成?

以某一个位置为中心能扩多大,但是没法找到偶数回文
加入“#”(任意),除2向下取整
12、Manacher_第1张图片
12、Manacher_第2张图片
O ( n 2 ) O(n^2) O(n2)

回文半径、直径

12、Manacher_第3张图片

最右回文右边界R

12、Manacher_第4张图片

中心点C

12、Manacher_第5张图片

Manacher流程

case1

没在R里,就暴力扩

当前位置没在R里,暴力左右 扩
12、Manacher_第6张图片
0~0=>R = 0
12、Manacher_第7张图片
1不在R里,暴力扩,R更新为2
12、Manacher_第8张图片

case2

在R里
12、Manacher_第9张图片
根据i’回文情况分类

case2-(1)
i’回文区域在[L, R]
12、Manacher_第10张图片
12、Manacher_第11张图片
i的回文区域就是[Z, P]
12、Manacher_第12张图片

case2-(2)

i’扩展出来的部分到了[L, R]外
12、Manacher_第13张图片
这个时候i自己的答案就是,[R相对于i的对称点, R]
12、Manacher_第14张图片
case2-(3)
i’扩展出来的有边界恰好是L
12、Manacher_第15张图片
对于i,不用验证[R’, R],要验证R’-1和R+1
12、Manacher_第16张图片
12、Manacher_第17张图片
O ( n ) O(n) O(n)

code

package tisheng.class03;

public class Code02_Manacher {
   

	//塞一个字符
	//1221 -> #1#2#2#1#
	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] = (i & 1) == 

你可能感兴趣的:(左神算法,开发语言)