最大回文字符串
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Input: "cbbd"
Output: "bb"
思路:最大回文字符串利用manacher算法(马拉车算法)
最开始的思路是遍历字符串,以每一位为中心向两边扩展,寻找最大的回文字符串,并更新最大值,最后返回最长字符串即可。但是此方法的时间复杂度为 O(n2)。因为不能完全利用以前已经知道的信息。
manacher算法:也是遍历字符串,寻找最大的回文长度。但是此算法要充分利用以前已经算出回文长度的位置的信息。
(参考文章:https://mp.weixin.qq.com/s/Zrj35DrnQKtAENiR5llrcw)
- 寻找回文字符串能够覆盖到的右边界
rightSide
和此时回文串的中心点rightSideCenter
- 下一个待查找的点
i
不能被右边界覆盖,即i > rightSide
此时只能以此点为中心向两边扩展,寻找最大回文串 - 下一个待查找的点
i
可以被右边界覆盖,即i < rightSide
寻找关于rightSideCenter
的左边对称点,查看此位置的回文串半径halfLength
如果i+halfLength < rightSideCenter
,根据对称性,此点的回文串和对应位置的是一样的,就不必再进行计算
如果i+halfLength > rightSideCenter
,那么此点处到2*rightSide-i 到 rightSide
这一段还是回文的,但是rightSide
之后的还需要再次进行扩展,判断回文串长度是否可以再增加 - 每次寻找到新的最右边界之后,比较此回文串和之前的大小,得到最大回文串
java代码:
package Code.src.LeetCode;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import java.util.Scanner;
public class Medium_LongestPalindromicSubstring {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
Medium_LongestPalindromicSubstring ml = new Medium_LongestPa