Description:
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.
Solution:
思路:本题的核心思想就是用双指针 low 和 high 来表示回文的头尾位置( low - high 之间的字符串满足回文)
对于某个字符,向左边和右边(如果存在的话)查找
如果 左边 = 右边,则满足回文条件,然后 low–; high++;
如果 左边 = 当前字符,则满足回文条件,然后 low–;
如果 右边 = 当前字符,则满足回文条件,然后 high++; i = high; (这部非常重要,可以省很多不必要遍历)
PS:
- 如果某个字符左边和右边一位相等“aba”,且不属于“aaa”类型,令flag = 1,如果再碰到与左边相等或与右边相等,直接break,不符合回文
- i = high; 这句话很重要,对于“aaaa”类型,遍历第一个a的时候,直接遍历了前4个a。所以可以直接跳过。
代码如下:
public String longestPalindrome(String s) {
if(s.length() == 0 && s.length() == 1)
return s;
String result = "";
for(int i = 0; i < s.length(); ++i) {
int low = i, high = i;
if(result == "")
result = s.substring(i, i + 1);
int flag = 0;
while(low >= 0 && high < s.length())
if(low - 1 >= 0 && high + 1 < s.length() && s.charAt(low - 1) == s.charAt(high + 1)) {
if(result.length() < s.substring(low - 1, high + 2).length())
result = s.substring(low - 1, high + 2);
if(s.charAt(i) != s.charAt(low - 1))
flag = 1;
low--; high++;
continue;
} else if(low - 1 >= 0 && s.charAt(low - 1) == s.charAt(high)) {
if(flag == 1)
break;
if(result.length() < s.substring(low - 1, high + 1).length())
result = s.substring(low - 1, high + 1);
low--; continue;
} else if(high + 1 < s.length() && s.charAt(low) == s.charAt(high + 1)) {
if(flag == 1)
break;
if(result.length() < s.substring(low, high + 2).length())
result = s.substring(low, high + 2);
high++; i = high; continue;
} else
break;
}
return result;
}