题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
输入: "babad"
输出: "bab" 注意: "aba" 也是一个有效答案。
方法一:暴力法(超出时间限制)
思路:时间复杂度O(n^3),空间负责度O(n),用于存储s的最大长度
【1】以长度length进行for循环 for(length=str.legnth();length>0;length--)
【2】对截取的字符串进行判断,若是回文字符串则返回,否则继续遍历
string longestPalindrome(string s) {
int length, begin; //length为截取长度,begin为开始截取的下标
for (length = s.length();length > 0;--length) {
for (begin = 0;begin <= s.length() - length;++begin) {
string str = s.substr(begin, length); //截取的字符串
//对截取字符串进行判断
int len = str.length(), i;
for (i = 0;i < len / 2;++i) {
if (str[i] != str[len - 1 - i])
break;
}
//符合回文字符串
if (i >= len / 2)
return str;
}
}
return "";
}
方法二:中心向外扩散方法
思路:时间复杂度O(n^2)
【1】若S_ij为回文字符串,且S_(i-1)==S_(j+1),则S_i-1,j+1也为回文字符串
【2】讨论S开始长度为奇数或偶数
int max = -1;
string ans = ""; //记录最长回文字符串
void getPalindromeStr(int i, int j, string s) {
while (i >= 0 && j < s.length()) {
if (s[i] == s[j]) {
int length = j - i + 1; //当前字符串长度
if (max < length) {
max = length;
ans = s.substr(i, length);
}
--i;
++j;
}
else {
break;
}
}
}
string longestPalindrome(string s) {
if (s.length() <= 1)
return s;
for (int i = 0;i < s.length() - 1;++i) {
getPalindromeStr(i, i + 1, s); //获取偶数回文字符串
getPalindromeStr(i, i, s); //获取奇数回文字符串
}
return ans;
}
方法三:Manacher算法
本人水平有限,还未完全理解。
贴出讲解该算法的博客:https://blog.csdn.net/qq_32354501/article/details/80084325