最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
https://leetcode.cn/problems/longest-palindromic-substring/description/
解题思路:
分为奇数以及偶数
while循环每次从当前点,向两边遍历
如果遍历到 s[left] != s[right] 则结束
所以left 以及 right 不包含
cpp
#include <iostream>
#include <string>
using namespace std;
pair<int, int> expandFromCenter(string &s,int left ,int right) {
int n = s.size();
// 从中间开始 left向左扩展,right向右扩展
while (left >= 0 && right < n && s[left] == s[right]) {
left--;
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++)
{
// 奇数
pair<int,int> result1 = expandFromCenter(s, i, i);
int l1 = result1.first;
int r1 = result1.second;
// 偶数
pair<int, int> result2 = expandFromCenter(s, i, i + 1);
int l2 = result2.first;
int r2 = result2.second;
if(r1 - l1 > end - start) {
start = l1;
end = r1;
}
if (r2 - l2 > end - start) {
start = l2;
end = r2;
}
}
return s.substr(start, end - start + 1);
}
int main() {
string s = "babad";
cout << longestPalindrome(s) << endl;
}
pair<int,int>的使用
pair将一对值(T1和T2)组合成一个值,
这一对值可以具有不同的数据类型(T1和T2),
两个值可以分别用pair的两个公有函数first和second访问。