Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd" Output: "bb"
解题思路:
1、循环一次所有对称轴,找到每个对称轴对应的字串长度,记下最长的子串。
2、将字符串转化为char[]数组,循环每一个元素,每个元素在遍历时对应有2个对称轴,分别是自己本身和该元素与前一个元素中间的空隙。
代码如下:
public static String longestPalindrome(String s) { if (null == s || 0 == s.length() || 1 == s.length()) { return s; } char[] strArrays = s.toCharArray(); int left, right, left2; int maxlen[] = new int[3]; // 循环的每个可能的对称轴,找到最长的对称子列 for (int i = 1; i < strArrays.length; i++) { left = right = i;// 对称轴为当前循环元素 left2 = i - 1;// 对称轴为当前循环元素和前一个元素中间的空位 int[] temp1 = moveTheVernier(left, right, strArrays); int[] temp2 = moveTheVernier(left2, right, strArrays); if (maxlen[0] < (temp1[0] > temp2[0] ? temp1[0] : temp2[0])) { maxlen = Arrays.copyOf((temp1[0] > temp2[0] ? temp1 : temp2), 3); } } return s.substring(maxlen[1] + 1, maxlen[2]); } private static int[] moveTheVernier(int left, int right, char[] strArrays) { while (left >= 0 && right < strArrays.length) { if (strArrays[left] == strArrays[right]) { left--; right++; } else { break; } } return new int[] { right - left + 1, left, right }; }
其实最初版本的代码并没有使用这么多数组记录位置,当时moveTheVernier()方法,直接通过s.substring(left+1, right)返回每次截取到的当前最长字串,但是考虑到substring()方法会消耗很多不必要的时间(不利于leetcoode排名?),后面才改为只在返回结果时截取一次字符串。