题目

Given a string s, return the longest palindromic substring in s.

Example 1:

Input: s = “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example 2:

Input: s = “cbbd”
Output: “bb”
Example 3:

Input: s = “a”
Output: “a”
Example 4:

Input: s = “ac”
Output: “a”

Constraints:

1 <= s.length <= 1000
s consist of only digits and English letters (lower-case and/or upper-case),

解法:枚举

由于字符串长度小于1000,因此我们可以用 O(n2)O(n2) 的算法枚举所有可能的情况。
首先枚举回文串的中心 ii,然后分两种情况向两边扩展边界,直到遇到不同字符为止:

  • 回文串长度是奇数,则依次判断 s[i−k]==s[i+k],k=1,2,3,…s[i−k]==s[i+k],k=1,2,3,…
  • 回文串长度是偶数,则依次判断 s[i−k]==s[i+k−1],k=1,2,3,…s[i−k]==s[i+k−1],k=1,2,3,…

如果遇到不同字符,则我们就找到了以 ii 为中心的回文串边界。

时间复杂度O(n2),空间复杂度O(1)

  1. class Solution {
  2. public:
  3. string longestPalindrome(string s) {
  4. string ans;
  5. for (int i = 0; i < s.size(); i++) {
  6. int l = i - 1, r = i + 1;
  7. while (l >= 0 && r < s.size() && s[l] == s[r]) l--, r++;
  8. if (ans.size() < r - l - 1) ans = s.substr(l + 1, r - l - 1);
  9. l = i, r = i + 1;
  10. while (l >= 0 && r < s.size() && s[l] == s[r]) l--, r++;
  11. if (ans.size() < r - l - 1) ans = s.substr(l + 1, r - l - 1);
  12. }
  13. return ans;
  14. }
  15. };