LeetCode 5. Longest Palindromic Substring 最长回文子串
给定一个字符串 s
,找到s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
1 2 3
| 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
|
示例 2:
看到题目最容易想到的解决办法就是把这两个有序数组合并为一个有序数组,这样根据这一个有序数组就能很方便的找到中位数。
Java题解1:
按照上述思路可以得到下面的解法,合并为一个数组时间复杂度为\(O(m+n)\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
public String longestPalindrome(String s) { char[] chars = s.toCharArray(); if (s.length() == 0) { return ""; } int max = 1; int index = 0; for (int i = 0; i < chars.length; i++) { if (i > 0) { int dev1 = 0; int len1 = 0; loop1: while (i - dev1 > 0 && i + dev1 < chars.length) { if (chars[i + dev1] == chars[i - dev1 - 1]) { len1 = len1 + 2; if (len1 > max) { max = len1; index = i + dev1; } dev1++; } else { break loop1; } } if (i > 1) { int dev2 = 0; int len2 = 1; loop2: while (i - dev2 - 1 > 0 && i + dev2 < chars.length) { if (chars[i + dev2] == chars[i - dev2 - 2]) { len2 = len2 + 2; if (len2 > max) { max = len2; index = i + dev2; } dev2++; } else { break loop2; } } } } } return s.substring(index - max + 1, index + 1); }
|
为了代码简介,把每次判断的代码提取出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
public String longestPalindrome2(String s) { int n = s.length();
int[] range = new int[2]; for (int i = 0; i < n; i++) { i = helper(s, range, i); }
return s.substring(range[0], range[1]); }
public int helper(String s, int[] range, int i) { int lo = i; int hi = i; while (hi < s.length() - 1 && s.charAt(hi) == s.charAt(hi + 1)) { hi++; }
int ret = hi; while (lo > 0 && hi < s.length() - 1 && s.charAt(lo - 1) == s.charAt(hi + 1)) { lo--; hi++; }
if (hi - lo + 1 > range[1] - range[0]) { range[0] = lo; range[1] = hi + 1; }
return ret; }
|