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)