Manacher算法
——最长回文子串
在每个串中间加一个特殊字符 ‘#’(随意,什么都行),这样 回文串就无论是奇数个还是偶数个,都一样了
int pArr[i] // 表示 第i个数的那个位置处的回文半径(palindrome Array) int pR =
0; // 表示回文半径能够扫到的最右的那个位置的 下一个位置(palindrome Right)
//从第0个位置开始, pR = i + pArr[i] + 1; int index //回文中心 什么时候更新pR,什么时候记录
//pR和index是同时变化的, index = i;
第1种拓扑
第2种拓扑
此时 pArr[i] = (pR-1) - i;
例:
第3种拓扑
此时 pArr[ i’ ] = **; 左大 = 左小
例:
第4种拓扑
暴力扩:
时间复杂度:pR(0~2N)
(空间换时间,通过评价空间的变化来评价时间)
关于时间复杂度的一个 狂抓酷炫吊炸天的公式:
Master Method Restated
n/b:下一次进行递归的数据量
a : 这样的递归行为发生的次数
O(n^d):除去递归之外的 复杂度的部分
例:归并排序
根据Master公式:
∵ 归并排序的d = log {_b} {^a} = 1
∴ T(n) = n lg(n)