自己想了个解法,发现有些许错误,请指正,谢谢。
题目:
给你一个字符串 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 算法。