给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
1、中心扩展法
class Solution { public String longestPalindrome(String s) { //中心扩展法 int start = 0,end = 0; if(s == null || s.length() == 0) return ""; for(int i = 0;i < s.length();i++){ int len1 = expand(s,i,i); int len2 = expand(s,i,i + 1); int len = Math.max(len1,len2); if(len > end - start +1){ start = i - (len - 1) / 2; //len / 2 end = i + len / 2; } } return s.substring(start,end + 1); } private int expand(String s,int i,int j){ int len = 1; int l = i,h = j; while(i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)){ len = (j - i + 1 > len) ? (j - i + 1) : len; i--; j++; } return len; } }
2、Manacher
class Solution { public String longestPalindrome(String s) { //Manacher String manacherStr = getManacherStr(s); char[] charArray = manacherStr.toCharArray(); int[] pArray = new int[charArray.length]; int pR = -1; int index = -1; int max = 0; int start = 0; for(int i = 0;i < charArray.length;i++){ //首先判断是否在最远边缘内部 //pArray[2 * idnex - i]处的半径 pArray[i] = i < pR ? Math.min(pR - i,pArray[2 * index - i]) : 1; while(i + pArray[i] < charArray.length && i - pArray[i] >= 0){ if(charArray[i + pArray[i]] == charArray[i - pArray[i]]){ pArray[i]++; }else{ break; } } //更新最右边缘与其index if(i + pArray[i] > pR){ pR = i + pArray[i]; index = i; } //更新起始位置 if(pArray[i] > max){ max = pArray[i]; start = (i - max + 1) / 2; } } //max为真实长度 - 1 return s.substring(start,start + max - 1); } private String getManacherStr(String s){ String res = "#"; for(int i = 0;i < s.length();i++){ res += s.charAt(i) + "#"; } return res; } }