【Leetcode 647题 回文子串】Manacher 算法
Manacher 算法也会面临奇数长度和偶数长度的问题,它的处理方式是在所有的相邻字符中间插入 ###,比如 aba 会被处理成 $#a#b#a#%,这样可以保证所有找到的回文串都是奇数长度的,以任意一个字符为回文中心,既可以包含原来的奇数长度的情况,也可以包含原来偶数长度的情况。在字符串最前面和最后面分别插入$和%,可以简化遍历时候的边界条件。
dp[i]表示以i为中心的回文子串的长度。rMax表示当前已知回文串的最右端点,iMax表示这个最右端点对应的回文串的中心,rMax = iMax+dp[iMax]-1。j表示在i相对于iMax的对称点,j = 2*iMax-i。当我们求dp[i]时,利用回文串的对称性,如果i <= rMax时,dp[i]>=dp[j]。
具体代码如下:
public int countSubstrings(String s) {
StringBuilder sb = new StringBuilder("$#");
for(int i =</