题目
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
1 2 3
| 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
|
示例 2:
题解
Round 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
class Solution { public String longestPalindrome(String s) {
if(s.length()<=1) return s; char[] arr = s.toCharArray(); String resString = ""; for(int i=1; i<arr.length; i++) { String currString = ""; String currString2 = "";
currString+=arr[i]; for (int j=0; j < i; j++) { if(i+1+j<arr.length && i-1-j>=0 && arr[i+1+j]==arr[i-1-j]){ currString=arr[i+1+j]+currString+arr[i-1-j]; } else { break; } }
for (int j=0; j < i; j++) { if(i+j<arr.length && i-1-j>=0 && arr[i+j]==arr[i-1-j]){ currString2=arr[i+j]+currString2+arr[i-1-j]; } else { break; } } if(currString.length()>resString.length()) { resString = currString; } if(currString2.length()>resString.length()) { resString = currString2; } } return resString; } }
|
中间遇到2个坑:
- 刚开始,currString使用StringBuilder,会发现很多重复元素。原因是append()都是在原对象上操作的;
- 刚开始打算把2种情况合并到一个for循环中,调了好久发现不行,二者对的结果会相互影响。比如不连续时要跳出循环;
Round 2(双指针)
上面解法的着力点在单个字符,循环时以某一个字符为主,每次只移动1个字符。
还有一种解法是双指针,每次同时移动2个字符。这也是回文题的特点。
重点关注回文函数中的边界,以及最终如何截取子串。
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 53 54 55 56
|
class Solution { public String longestPalindrome(String s) {
String resString = "";
for (int i = 0; i < s.length(); i++) { String leftRes = plalindrome(s, i, i); String rightRes = plalindrome(s, i, i+1); if(leftRes.length()>resString.length()) { resString = leftRes; } if(rightRes.length()>resString.length()) { resString = rightRes; } } return resString; }
public static String plalindrome(String s, int left, int right){ char[] arr = s.toCharArray();
while(left>=0 && right<arr.length && arr[left] == arr[right]){ left--; right++; } if(left+1 < right) return s.substring(left+1, right); return ""; } }
|