题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
答案(java版):
public String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
int n = s.length(), maxLen = 0, start = 0;
int[] result = new int[2];
for (int i = 0; i < n - 1; i ++) {
result = searchPalindrome(s, i, i, result);
result = searchPalindrome(s, i, i + 1, result);
}
// result[0]:start result[1]:maxLen
return s.substring(result[0], result[0] + result[1]);
}
public int[] searchPalindrome(String s, int left, int right, int[] result) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left --;
right ++;
}
if (result[1] < right - left - 1) {
result[0] = left + 1;
result[1] = right - left - 1;
}
return result;
}
分析:
回文串,就是正读反读都一样的字符串,比如 “bob”, “level”, “noon” 等等。那么最长回文子串就是在一个字符串中的那个最长的回文子串。我们知道传统的验证回文串的方法就是两个两个的对称验证是否相等,那么对于找回文字串的问题,就要以每一个字符为中心,像两边扩散来寻找回文串,这个算法的时间复杂度是 O(n*n),可以通过 OJ,就是要注意奇偶情况,由于回文串的长度可奇可偶,比如 “bob” 是奇数形式的回文,“noon” 就是偶数形式的回文,两种形式的回文都要搜索,对于奇数形式的,我们就从遍历到的位置为中心,向两边进行扩散,对于偶数情况,我们就把当前位置和下一个位置当作偶数行回文的最中间两个字符,然后向两边进行搜索。
LeetCode执行结果:通过
执行用时 :7 ms, 在所有 Java 提交中击败了95.64%的用户
内存消耗 :36.7 MB, 在所有 Java 提交中击败了90.21%的用户