题目描述:
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
当数据量较小时可以采取暴力的方法进行求解,时间复杂度为O(n^3),这里我主要给出两种O(n^2)的解法分别是动态规划以及中心扩展法,当然还有O(n)的解法,请读者自行去探索。
(一)动态规划
#include<bits/stdc++.h>
using namespace std;
//#pragma G++ optimize (2)
#define lowbit x & (-x);
#define lc p << 1
#define rc p << 1 | 1
const int N=1e6+10;
typedef long long ll;
typedef unsigned long long ull;
const int P=131;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
typedef pair<int,int>PII;
//动态规划法
/*
dp[i][j]表示以i为开头以j为结尾的子串是否是回文串
dp[i][j]==true : 是
dp[i][j]==false : 不是
状态转移:
当j-i<3时 dp[i][j]=true
否则dp[i][j]=dp[i+1][j-1];
*/
string s;
bool dp[10000][10000];
void solve(){
cin >> s;
int n = s.length();
if(n<2){
cout << s << '\n';
return;
}
int maxlen = 1;
int begin = 0;
for (int i = 0; i < n;i++){
dp[i][i] = true;
}
for (int k = 2; k <= n;k++){
for (int i = 0; i < n;i++){
int j = k + i - 1;
if(j>=n){
break;
}
if(s[i]!=s[j]){
dp[i][j] = false;
}else {
if(j-i<3){
dp[i][j] = true;
}else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if(dp[i][j]==true&&j-i+1>maxlen){
maxlen = j - i + 1;
begin = i;
}
}
}
cout << s.substr(begin, maxlen) << '\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
// cin >> T;
T=1;
while(T--){
solve();
}
return 0;
}
(二):中心扩展法
#include<bits/stdc++.h>
using namespace std;
//#pragma G++ optimize (2)
#define lowbit x & (-x);
#define lc p << 1
#define rc p << 1 | 1
const int N=1e6+10;
typedef long long ll;
typedef unsigned long long ull;
const int P=131;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
typedef pair<int,int>PII;
//中心扩展法
void solve(){
string s;
cin >> s;
int n = s.length();
if(n<2){
cout << s << '\n';
return;
}
int maxlen = 1;
int begin = 0;
for (int i = 0; i < n;i++){
int ka = i, kb = i; //奇数
while(ka>=0&&kb<n&&s[ka]==s[kb]){
if(kb-ka+1>maxlen){
maxlen = kb - ka + 1;
begin = ka;
}
ka--;
kb++;
}
ka = i, kb = i + 1; //偶数
while(ka>=0&&kb<n&&s[ka]==s[kb]){
if(kb-ka+1>maxlen){
maxlen = kb - ka + 1;
begin = ka;
}
ka--;
kb++;
}
}
cout << s.substr(begin, maxlen) << '\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
// cin >> T;
T=1;
while(T--){
solve();
}
return 0;
}