最长回文子串
示例
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
题解分析
中心扩散法,遍历字符串第1个到第n减1个。拿到下标对比下标左右两边字符是否相等,根据是否相等记录最长回文子串长度和子串起始下标。最后由 string.substr()函数取出回文。
代码展示
string longestPalindrome(string s) {
int maxlen = 1;
int begin = 0;
for (unsigned i = 0; i < s.size() - 1; i++)
{
int oddLen = func(s, i, i); // 奇数下标
int evenLen = func(s, i, i + 1); // 偶数下标
int curMaxLen = oddLen > evenLen ? oddLen : evenLen;
if (curMaxLen > maxlen)
{
maxlen = curMaxLen;
/*begin = i - (maxlen - 1) / 2; // 奇数
begin = i - (maxlen - 2) / 2; // 偶数*/
begin = i - (maxlen - 1) / 2;
// 合并 -1对奇偶个数都不影响,整数除法向下取整
}
}
return s.substr(begin, maxlen);
}
int func(string& str, int left, int right)
{
while (left>=0 && right < str.size())
{
if (str.at(left) == str.at(right))
{
left--;
right++;
}
else
{
break;
}
}
return right - left - 1;
}
心得
- func() 函数中,执行到return函数时,right 的下标和left 的下标应该是 回文所在的起始下标的前一个和结束下标后一个。while 先执行 内部语句再判断,当时未考虑到导致maxlen出错
- C++ 中的string.substr(begin, len); 函数参数为 begin: 截取字符的起始下标,len 截取字符的长度。
- 回文字符串begin的下标受回文个数是奇数还是偶数的影响,具体原因已写在注释中。
时间空间
时间复杂度:
空间复杂度:
勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏
陶渊明