给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本人解法:
class Solution {
public:
string longestPalindrome(string s1) {
//只有一个字符时直接返回
if(s1.size()==1)return s1;
int lt, rt,lenth;
lt=rt=0;
lenth=1;
for (int i = 0; i < s1.size(); i++)
{
int tmp = s1.rfind(s1[i]);
while (tmp != i&& (tmp - i + 1) > lenth)//tmp==i时,说明找到的是i这个元素,无意义便不进入循环;(tmp-i+1)>lenth时说明当前可能的回文串是最大的回文串
{
int lp = i+1;
int rp = tmp-1;
while (lp < rp)
{
if (s1[lp] == s1[rp])
{
lp++;
rp--;
}
else break;
}
if (lp >= rp)
{
if ((tmp-i+1) > lenth)
{
lt = i;
rt = tmp;
lenth = tmp - i+1;
}
}
tmp = s1.rfind(s1[i], tmp - 1);
}
}
string s2;
if (lt == rt)s2.assign(s1, lt, 1);//lt==rt时,说明当前字符串无回文,直接返回第一个字符
else s2.assign(s1, lt, lenth);
return s2;
}
};
主要利用的string函数的rfind,先进入for循环,利用rfind函数查找当前下标元素,若rfind返回的下标值不与当前的i相同,说明可能构成回文
leetcode中心扩展算法:
class Solution {
public:
pair<int, int> expandAroundCenter(const string& s, int left, int right) {
while (left >= 0 && right < s.size() && s[left] == s[right]) {
--left;
++right;
}
return {left + 1, right - 1};
}
string longestPalindrome(string s) {
int start = 0, end = 0;
for (int i = 0; i < s.size(); ++i) {
auto [left1, right1] = expandAroundCenter(s, i, i);
auto [left2, right2] = expandAroundCenter(s, i, i + 1);
if (right1 - left1 > end - start) {
start = left1;
end = right1;
}
if (right2 - left2 > end - start) {
start = left2;
end = right2;
}
}
return s.substr(start, end - start + 1);
}
};