leetcode 最长回文子串_java 实现
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
这类问题通常有四个解法:
1.暴力法,即把所有子串都遍历一遍,并判断出最长的回文子串,因为遍历所有子串是O(n^2),判断是否是回文子串是O(n),这三个是嵌套循环,所以时间复杂度是O(n^3)。
2.中心扩展法,即遍历一遍字符串,并把当前字符从当前位置往左右两边辐射,记录最长子串的初始下标和长度,时间复杂度为O(n^2);
3.动态规划法
4.Manacher法,时间复杂度为O(n)
由于对3和4不太熟悉,所以第一次做时采用的是第二种方法:
class Solution { public String longestPalindrome(String s) { int len=s.length(); int start=0; int max=0; if (len==1) return s; //当回文中心是一个字符时,形如"aba" for (int i=0;i<len ;i++ ) { int j=i; int k=i; while (j>=0&&k<len&&s.charAt(j)==s.charAt(k)) { if ((k-j+1)>max) { start=j; max=k-j+1; } j--; k++; } } //当回文中心是两个相同的字符时,形如"abba" for (int i=0;i<len ; i++) { int j=i; int k=i+1; while (j>=0&&k<len&&s.charAt(j)==s.charAt(k)) { if ((k-j+1)>max) { start=j; max=k-j+1; } j--; k++; } } if (max>=0) { return s.substring(start,start+max); } return null; } }
结果: