最長迴文子串
- 描述
- 輸入一個字符串,求出其中最長的迴文子串。子串的含義是:在原串連續出現的字符串片段。迴文的含義是:正着看和倒着看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出(首尾不要輸出多餘的字符串)。輸入字符串長度大於等於1小於等於5000,且單獨佔一行(如果有多組答案,輸出第一組)。
- 輸入
- 輸入一個測試數據n(1<=n<=10);
隨後有n行,每行有一個字符串。 - 輸出
- 輸出所要求的迴文子串。
- 樣例輸入
-
1 Confuciuss say:Madam,I'm Adam.
- 樣例輸出
-
Madam,I'm Adam
-
思路:從前往後找比較浪費時間,所以從中間往兩邊找。用兩個指針記錄字母分別往兩邊枚舉。
-
注意:迴文串的長度有可能爲奇數也有可能爲偶數。
#include<stdio.h> #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<map> #include<cmath> #define mv(a,b) memset(a,b,sizeof(a)); using namespace std; typedef long long LL; const int maxn=5000+10; const double eps=1e-8; const double PI =acos(-1.0); int pos[maxn]; char s[maxn],a[maxn]; bool judge(char s) { if((s>='a'&&s<='z')||(s>='A'&&s<='Z')) return true; return false; } int main() { // ios_base::sync_with_stdio(false); // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); int T; cin>>T; getchar(); while(T--) { memset(pos,0,sizeof(pos)); gets(s); int len=strlen(s); int k=0; for(int i=0;i<len;i++) { if(judge(s[i])) { if(s[i]>='A'&&s[i]<='Z') { pos[k]=i; a[k++]=s[i]-'A'+'a'; } else { pos[k]=i; a[k++]=s[i]; } } }//處理字符串。 int ll,rr,maxx; ll=0; rr=0; maxx=0; for(int i=0;i<k;i++) { for(int j=0;;j++) { if(i-j<0||i+j>=k) break; if(a[i-j]!=a[i+j]) break; if(j*2+1>maxx) { maxx=j*2+1; ll=pos[i-j]; rr=pos[i+j]; } }//字符串長度爲奇數 for(int j=0;;j++) { if(i-j<0||i+j+1>=k) break; if(a[i-j]!=a[i+j+1]) break; if(j*2+2>maxx) { maxx=j*2+2; ll=pos[i-j]; rr=pos[i+j+1]; } }//字符串長度爲偶數 } for(int i=ll;i<=rr;i++) cout<<s[i]; cout<<endl; } }