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.
Example 2:
Input: “cbbd”
Output: “bb”
AC代碼:
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() <= 1) return s;
int maxIdx = 0;
int maxLen = 1;
int i = 0;
while (i < s.size()) {
int start = i;
int end = i;
// expand the window from the end if it's an even palindrome
while (end + 1 < s.size() && s[end] == s[end + 1]) { end++; }
i = end + 1;
// expand the window from both sides until it's not longer a palindrome
while (start - 1 >= 0 && end + 1 < s.size() && s[start - 1] == s[end + 1]) {
start--, end++;
}
int currLen = end - start + 1;
if (currLen > maxLen) {
maxIdx = start;
maxLen = currLen;
}
}
return s.substr(maxIdx, maxLen);
}
};
測試與結果
int main() {
Solution s;
string testString1 = "ababa";
string result1 = s.longestPalindrome(testString1);
cout << result1 << endl;
string testString2 = "cbbd";
string result2 = s.longestPalindrome(testString2);
cout << result2 << endl;
}
總結
本題將窗口按照兩個方向進行擴展,如果遇到重複字符,就按照end++的方向擴展,直至不重複爲止。如果不存在重複字符,就嘗試從兩個方向擴展窗口,直至不滿足迴文的條件爲止。