题目说明
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
分析
按一个数字为中心,然后左右展开来判断是否相同,注意要分以一个数字为中心,如“babad”,或者以两个数字为中心,如“cbbd”。这种情况,写一个通用的函数借口来实现。
由于返回的是最长子串,所以要定义一个最大长度的变量,来对每次得到的一个子串的长度作比较,如果比上次大,那就把它遍历的最左边的下标返回。这里利用下标可以统计字符串的长度,就不用再定义不断加1的变量。
C++代码
class Solution {
public:
string longestPalindrome(string s) {
int index = 0; //索引,返回最长回文子串的第一个字符
int maxlen = 0;
if(s.size() <= 1) {
return s;
}
for(int i = 0; i < s.size(); i++) {
//由于要对以一个或两个数为中心的情况做判断,所以直接封装成一个函数
search(s,i,i,index,maxlen);
search(s,i,i+1,index,maxlen);
}
return s.substr(index, maxlen);
}
void search(string s, int left, int right, int& index, int& maxlen) {
while( left >= 0 && right < s.size() && s[left] == s[right]) {
//cout<<s[left]<<endl;
left--;right++;
}
//注意这里的长度是right-left-1,left往左right往右多了一位
if( maxlen < right-left-1 ) {
maxlen = right-left-1;
index = left + 1;
}
}
};