nyoj 132 最長迴文子串

最長迴文子串

時間限制:1000 ms  |  內存限制:65535 KB
難度:4
描述
輸入一個字符串,求出其中最長的迴文子串。子串的含義是:在原串連續出現的字符串片段。迴文的含義是:正着看和倒着看是相同的,如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;
	}
}

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章