普通版本(暴力枚举)
解题关键:
1、记录最长回文字串的长度和起始字符的下标
2、判断回文字串的逻辑与整体逻辑分离
3、先确定寻找回文字串的边界范围后从两边向中间寻找
class Solution {
public:
//从两侧向中间寻找
string longestPalindrome(string s) {
int sz = s.size();
if(sz < 2) return s;
int lengthMax = 1;//当前最长回文字串的起始长度
int begin = 0;//当前最长回文字串的起始下标
for(int i = 0;i<sz-1;i++)//回文不可能到数组末尾,因为如果这样的话
{
for(int j = i + 1;j<sz ;j++)
{//判断[i,j]范围内的子串是不是回文子串,如果是,且回文字串的长度大于之前记录的范围内的子串是不是回文子串,如果是,且回文字串的长度大于之前记录的lengthhMax,就更新lengthMax和回文子串的下标i,就更新lengthMax和回文子串的下标i
if(j - i + 1 > lengthMax && judgeLPS(s,i,j))//LPS是最长回文子串Longest palindromic substring的缩写
{
lengthMax = j - i + 1;
begin = i;
}
}
}
return s.substr(begin,lengthMax);
}
private:
bool judgeLPS(const string& s,int left,int right)//防止字符串过长导致的超出内存限制问题,传引用传参进行判断
{
while(left < right)
{
if(s[left] != s[right])
{
return false;
}
else
{
left++;
right--;
}
}
return true;//在[i,j]范围内都相同了就返回真
}
};
时间复杂度:O(N^3)(两层for循环中还有一个while)
优化版本(中心扩散,待补充)
优化版本(动态规划,待补充)
~over~