给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
思路:
判断回文字符串条件为反序字符串相同,可以遍历字符串进行切片,然后逐个切片进行判断,暴力破解大法好,可以得到有效结果。
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
string res = "";
for (int i = 0; i < s.size(); i++){
for (int j = 1; j <= s.size(); j++){
string temp = s.substr(i, j);
for (int k = 0; k <= temp.size() / 2; k++){
if (temp[k] != temp[temp.size()-1-k])
break;
else if (k == temp.size() / 2)
res = temp.size() > res.size() ? temp : res;
}
}
}
return res;
}
};
int main(){
Solution s;
string res = s.longestPalindrome("aacabdkacaa");
cout << res << endl;
return 0;
}
崩溃的是,系统提交的时候显示超时,中止是因为系统随机输入了一个超长字符串,这个的确让暴力破解法的效果大大降低
---
优化:判断中止条件,当一个字符串不是回文字符串,那么在其基础上进行衍生的字符串也没必要进行判断,基于此可以采取中心扩散的方法。
中心扩散方法:遍历字符串,然后让每个字符为中心点(奇数为正中心,左右等步长扩散;偶数为左中心点,对称扩散)
!!!提示:别忘了设置循环跳出 break一下
#include <iostream>
#include <string>
using namespace std;
// class Solution {
// public:
// string longestPalindrome(string s) {
// string res = "";
// for (int i = 0; i < s.size(); i++){
// for (int j = 1; j <= s.size(); j++){
// string temp = s.substr(i, j);
// for (int k = 0; k <= temp.size() / 2; k++){
// if (temp[k] != temp[temp.size()-1-k])
// break;
// else if (k == temp.size() / 2)
// res = temp.size() > res.size() ? temp : res;
// }
// }
// }
// return res;
// }
// };
class Solution {
public:
string longestPalindrome(string s) {
string res = s.substr(0,1);
for (int i = 0; i < s.size(); i++){
for (int left = i-1, right = i+1; left >= 0 && right < s.size(); left--, right++){
if (s[left] == s[right]){
string temp = s.substr(left, right-left+1);
res = temp.size() > res.size() ? temp : res;
}
else break;
}
for (int left = i, right = i+1; left >= 0 && right < s.size(); left--, right++){
if (s[left] == s[right]){
string temp = s.substr(left, right-left+1);
res = temp.size() > res.size() ? temp : res;
}
else break;
}
}
return res;
}
};
int main(){
Solution s;
string res = s.longestPalindrome("aacabdkacaa");
cout << res << endl;
return 0;
}