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;
}