1. 程式人生 > >PAT L2-008. 最長對稱子串(25) (暴力,Manacher演算法和DP解決)

PAT L2-008. 最長對稱子串(25) (暴力,Manacher演算法和DP解決)

L2-008. 最長對稱子串

時間限制 100 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串為"s PAT&TAP s",於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:
Is PAT&TAP symmetric?
輸出樣例:
11
原題連結:https://www.patest.cn/contests/gplt/L2-008

1000的長度,100ms,o(N^2)的複雜度是可以過的,那就暴力列舉吧,

每次列舉起點和終點沒如果此子串是迴文串,那終點-起點+1即為迴文串的長度,即可求出最大長度.

中間有個小問題,看程式碼註釋.

AC程式碼:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+5;
char a[maxn];
int getMax(int x,int y)
{
	//注:下面結束條件,必須為i<=j!!!;
	//當此字串長度為偶數是會有問題
	//0	1	2	3	4
	//5	4	3	2	1
	for(int i=x,j=y; i<=j; i++,j--)
	{
		if(a[i]!=a[j])
			return 0;
	}
	return y-x+1;
}
int main()
{
	while(gets(a))
	{
		int len=strlen(a);
		int maxx=0;
		for(int i=0; i<len; i++)
		{
			for(int j=i; j<len; j++)
			{
				maxx=max(maxx,getMax(i,j));
			}
		}
		cout<<maxx<<endl;
	}
	return 0;
}

網上還有高手用了o(N)的時間複雜度解決此問題: