最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
解题:
循环遍历每个点做为中间点,以中间点向左右两边扩散,直到不符合条件为止,找出每次的最长串返回
class Solution {
public:
string palindrome(string s, int left, int right) {
int i = left;
int j = right;
while (i >= 0 && j < s.size()) {
if (s[i] != s[j]) {
break;
}
--i;
++j;
}
int pos = i+1; // 这里是不相等时跳到这,所以i+1跳到下一个相等的字符上
int len = j - pos;
return s.substr(pos, len);
}
string longestPalindrome(string s) {
string ret;
int valid = 0;
for (int i = 0; i < s.size(); ++i) {
string suba = palindrome(s, i, i); // 处理aba这样的情况,中间点为奇数
string subb = palindrome(s, i, i+1); // 处理abba这样的情况,中间点为偶数
valid = max(suba.size(), subb.size());
if (ret.size() < valid)
ret = suba.size() > subb.size() ? suba : subb;
}
return ret;
}
};
执行用时:124 ms, 在所有 C++ 提交中击败了62.63%的用户
内存消耗:241.5 MB, 在所有 C++ 提交中击败了34.34%的用户
优化点:
有更好的方法,叫做拉马车,相对复杂些,略。
作者:帅得不敢出门