LeetCode:5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 :
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
首先,如果给定一个字符串s,如何判断是否是回文字符串,见代码:
boolean IsPalindromicString(String s) { int n = s.length(); int left = 0; int right = n - 1; while (left < right) { if (s.charAt(left) == s.charAt(right)) { left++; right--; } else { return false; } } return true; }
中心扩展法:首先想到的肯定是这个。
遍历每一个字符,向两边扩展找到以其为中心的最长回文子串, 所有找到的回文子串的最大长度即所求 。
当然,要分奇偶两种情况。
class Solution { public String longestPalindrome(String s) { if (s == null || s.length() < 1) { return ""; } int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); int len2 = expandAroundCenter(s, i, i + 1); int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } public int expandAroundCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { --left; ++right; } return right - left - 1; } }
时间复杂度:O(n^2),其中n是字符串的长度。长度为1和2的回文中心分别有n和n−1个,每个回文中心最多会向外扩展O(n)次。
空间复杂度:O(1)
动态规划法

浙公网安备 33010602011771号