题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例
- 示例一
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
- 示例二
输入:s = “cbbd”
输出:“bb”
提示
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
解题思路
- 先得到字符串的长度,如果字符串长度为 1,直接返回原字符串,否则继续进行计算;
- 题目要求输出符合条件的字符串,因为目标字符串一定是原字符串的子串,所以只需要记录好返回字符串的开始位置以及长度信息即可;
- 从第一个字符开始,遍历整个原字符串:
- 分析发现返回的字符串长度有奇数和偶数两种情况。所以要对每个位置的字符都要进行两种情况的分析:
- 若返回结果串的长度为奇数,则它一定关于中间字符对称,此时只需进行简单的判断,并对结果进行处理;
- 若返回结果串的长度为偶数,可以向前先遍历,只到遍历到与当前字符不同的字符处,后面判断类似于结果长度为奇数时的情况; - 将返回结果用 substr() 从原字符串中拿出并返回。
代码
class Solution {
public:
string longestPalindrome(string s) {
int s_len = s.length();
if(s_len == 1){
// 长度为 1,直接返回
return s;
}
int index = 0;
int ret_start = 0; // 保存返回串在原串的起始位置
int ret_len = -1; // 保存返回串的长度
int ret_len_temp = 0; // 每次计算的结果先保存在此变量中,符合条件时再持久化
while(index < s_len){
// 遍历整个字符串
// 1. 返回结果的长度为奇数
int i = 1;
while(index - i > -1 && index + i < s_len && s[index-i] == s[index+i]){
i++;
}
ret_len_temp = (i - 1) * 2 + 1;
if(ret_len_temp > ret_len){
ret_len = ret_len_temp;
ret_start = index - i + 1;
}
// 2. 返回结果的长度为偶数
i = 1;
while(index + i < s_len && s[index+i] == s[index]){
i++;
}
int j = 1;
while(index - j > -1 && index + i < s_len && s[index-j] == s[index+i]){
i++;
j++;
}
ret_len_temp = j + i -1;
if(ret_len_temp > ret_len){
ret_len = ret_len_temp;
ret_start = index - j + 1;
}
index++;
}
// 截取出返回串并返回
return s.substr(ret_start, ret_len);
}
};
结果截图
总结
- 考察了字符串的相关概念,例如:子串的获取
- 对“回文”的理解
- 提高要全面分析问题的意识