习题库——最长回文子串
题目叙述
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
解题思路
我才用中心扩散的方法(也叫水滴法,宛如水滴入一碗清水之中,泛起一圈圈水波)
实际原理图:
当出现碰壁的时候就会返回首尾的位置下标。
什么时候碰壁呢?或者说什么是碰壁呢?
就是当超过界限,或者最两端的数据不相同的时候就是碰壁了
上面示意图是单元素中心的,还有双中心的,那我们就只能让两个元素做起点了。
原理图如下:
程序实现
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);
}
};