C++ 暴力 算法 回文子串

自己想了个解法,发现有些许错误,请指正,谢谢。
题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:
输入:s = "cbbd"
输出:"bb"

class Solution {
public:
    string longestPalindrome(string s) {
        int maxlen=1;//子串最大长度
        int begin=0;//最大子串的起始下标
if(s.size()<2)
{
    return s;
}
    for(int i=0;isize();i++)//遍历所有字串
    {
        for(int j=i+1;jsize();j++)
        {
            if(j-i+1>maxlen &&change(s.substr(i,j)))//满足回文并且新回文子串的长度大于原先回文子串的长度
            {
                maxlen=j-i+1;
                begin=i;
            }
        }
    }
return s.substr(begin,begin+maxlen);//返回最大的的回文子串
    }

    bool change(string a)//判断是否为会回文子串
    {
        int left=0;
        int right=a.size()-1;
        while(left<=right)
        {
        if(a[left]!=a[right])
        {
            return false;
        }
        left++;
        right--;
        }
        return true;
    }
};

用动态规划

这段代码中有两个明显的错误:

在计算最大回文子串的起始下标时,使用了begin=i,但是在返回最大回文子串时,使用了s.substr(begin,begin+maxlen)。这里应该改为s.substr(begin,maxlen),因为substr函数的第二个参数表示子串的长度,而不是子串的结束下标。

在遍历所有字串时,使用了两个循环,第一个循环遍历字串的起始下标,第二个循环遍历字串的结束下标。但是这样的方法时间复杂度是O(n^2),因为要遍历所有的子串。如果字符串长度为n,那么遍历所有子串的时间复杂度是O(n^2),遍历每个子串的时间复杂度是O(n),因此总的时间复杂度是O(n^3)。所以该方法可能在处理长字符串时运行较慢。

为了更好地解决这个问题,我们可以使用更高效的算法,例如 Manacher 算法。