链接
我的代码:
class Solution {
public:string longestPalindrome(string s) {string res;for (int i = 0; i < s.size(); i++) {int l = i - 1, r = i + 1;while (l >= 0 && r < s.size() && s[l] == s[r])l--, r++;if (res.size() < r - 1 - (l + 1) + 1)res = s.substr(l + 1, r - l - 1);l = i, r = i + 1;while (l >= 0 && r < s.size() && s[l] == s[r])l--, r++;if (res.size() < r - 1 - (l + 1) + 1)res = s.substr(l + 1, r - l - 1);}return res;}
};
首先要注意这个子串和子序列的区别。前者要求连续。
这道题要求最长的,我们人工模拟一下会发现,回文串有两种:
所以我们要分类讨论:
l r两个指针,一个往左,一个往右,只要相等,那就说明回文串长度又增加了;
退出while循环时,l r指向的肯定不相等,或者越界了,所以[ l+1 , r-1]闭区间才是答案,长度是:
(r-1)-(l+1)+1,当它比res的size还大,我们就更新res,利用string的substr方法。
时间复杂度:
外层循环:遍历字符串的每个字符,时间复杂度为 O(n)。
内层循环:对于每个字符,最坏情况下可能会扩展到整个字符串(即在最坏情况下,两个指针分别到达字符串的两端),内层循环的时间复杂度为 O(n)。
空间复杂度是O(1)。