1040 Longest Symmetric String (25 分)难度: 一般 / 知识点: 最长回文子串

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1040 Longest Symmetric String (25 分)难度: 一般 / 知识点: 最长回文子串相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805446102073344
方法一: 最朴素的做法, 枚举所有的子串

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	string s; getline(cin,s);
	int ans=0;
	for(int i=0;i<s.size();i++)//起点
	{
		for(int j=1;j<=s.size()-i;j++)//长度
		{
			string a=s.substr(i,j);
			string b=a;
			reverse(b.begin(),b.end());
			if(a==b) ans=max(ans,j);
		}
	}
	cout<<ans;
}

方法二: 朴素版的优化,当枚举的长度已经小于我们当前保存的答案时,就不用枚举了。

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	string s; getline(cin,s);
	int ans=0;
	for(int i=0;i<s.size();i++)
	{
		for(int j=s.size()-i;j>ans;j--)//从大到小的枚举长度
		{
			string a=s.substr(i,j);
			string b=a;
			reverse(b.begin(),b.end());
			if(a==b) ans=max(ans,j);
		}
	}
	cout<<ans;
}

方法三: 双指针来维护,时间大幅度的优化。

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	string s; getline(cin,s);
	int ans=0;
	for(int i=0;i<s.size();i++)
	{
	    int l=i-1,r=i+1;//奇数的情况
	    while(l>=0&&r<s.size()&&s[l]==s[r]) l--,r++;//到不相等退出
	    ans=max(ans,r-l+1);//这里多算了2个
	    l=i-1;r=i;//偶数的情况
	    while(l>=0&&r<s.size()&&s[l]==s[r]) l--,r++;
	    ans=max(ans,r-l+1);这里多算了2个
	}
	cout<<ans-2;
}

以上是关于1040 Longest Symmetric String (25 分)难度: 一般 / 知识点: 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

PAT1040:Longest Symmetric String

1040. Longest Symmetric String (25)

1040. Longest Symmetric String (25)

1040. Longest Symmetric String (25)

1040 Longest Symmetric String (25分)

1040 Longest Symmetric String (25分)