51nod 1088 最长回文子串

回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5

解法一:

暴力枚举所有串

若当前枚举串长度大于已知最大回文串

传到函数里判断是否是回文串

#include <iostream>
using namespace std;
bool fun(string x,int len)
{
	for(int i = 0, j = len - 1; i <len / 2; i++, j--)
	{
		if(x[i] != x[j])
			return false;
	}
	return true;
}
int main()
{
	ios::sync_with_stdio(false);
	string text,tmp;
	int maxlen = 1, len;
	cin>>text;
	for(int i = 0; i < text.length(); i++)
	{
		tmp = text[i];
		for(int j = i + 1; j < text.length(); j++)
		{
			tmp = tmp + text[j];
			len = tmp.length();
			if(len > maxlen)
			{
				if(fun(tmp,len))
				{
					maxlen = len;
				}
			}
			//cout<<tmp<<' '<<len<<endl;
			//cout<<fun(tmp,len)<<endl;
		}
	}
	cout<<maxlen<<endl;
	return 0;
} 

解法二:

若连着两个字符相等 

如aa 则初始长度为2 

前后枚举是否相等 长度每次加2;

若隔一个字符相等 如aba 则初始长度为3  

前后枚举是否相等 长度每次加2;

比较求解

时间可以控制在15ms内

#include <iostream>
using namespace std;
int main()
{
	string a;
	cin>>a;
	int maxlen = 1, tmplen = 0, alen = a.length();
	int fst, lst;
	for(int i = 0; i < alen; i++)
	{
		if(a[i] == a[i + 1])
		{
			tmplen = 2;
			fst = i - 1;
			lst = i + 2;
			while(a[fst] == a[lst] && fst >= 0 && lst < alen)
			{
				tmplen += 2;
				fst--;
				lst++;
			}
		}
		if(tmplen > maxlen)
		{
			maxlen = tmplen;
		}
		if(a[i - 1] == a[i + 1])
		{
			tmplen = 3;
			fst = i - 2;
			lst = i + 2;
			while(a[fst] == a[lst] && fst >= 0 && lst <= alen)
			{
				tmplen += 2;
				fst--;
				lst++;
			}
		}
		if(tmplen > maxlen)
		{
			maxlen = tmplen;
		}
	}
	cout<<maxlen<<endl;
	return 0;
}




猜你喜欢

转载自blog.csdn.net/zeolim/article/details/80104720
今日推荐