题目描述
思路
暴力法时间复杂度为O(n3),会超时。网上关于这个问题有很多算法,比如动态规划DP,中心扩展算法。由于中心扩展算法较好理解,时间复杂度为O(n2),基本可以解决类似OJ题。
中心扩展算法
即以字符串某个位置为中心向两边扩展,直到不能构成回文串。
注意:区分奇数串与偶数串。
AC代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string s;
getline(cin, s);
int m = 1;
for (int i = 0; i < s.size(); i++) {
int k1=1,k2=0,len;
while(i - k1 >= 0 && i + k1 < s.size()&& s[i - k1] == s[i + k1]){
k1++;
}
int j = i + 1;
while (i - k2 >= 0 && j + k2 < s.size() && s[i - k2] == s[j + k2]) {
k2++;
}
len = max((k1-1) * 2 + 1,k2*2);
if (len > m) m = len;
}
cout << m;
return 0;
}
其他类似问题
leetcode或其他OJ上也有类似问题,如将此最长回文子串作为返回值:
string longestPalindrome(string s) {
int m = 1, pos = 0;
for (int i = 0; i < s.size(); i++) {
int k1, k2, len, tempos;
for (k1 = 1; i - k1 >= 0 && i + k1 < s.size() && s[i - k1] == s[i + k1]; k1++);
for (k2 = 0; i - k2 >= 0 && i + 1 + k2 < s.size() && s[i - k2] == s[i + 1 + k2]; k2++);
if (2 * k1 - 1 > 2 * k2) {
len = 2 * k1 - 1;
tempos = i - k1 + 1;
}
else {
len = 2 * k2;
tempos = i - k2 + 1;
}
if (len > m) {
m = len;
pos = tempos;
}
}
return s.substr(pos, m);
}