计蒜客2018 蓝桥杯省赛 B 组模拟赛(三)回文子串
第一次写,因为之前在网上没有找到这题,所以就尝试了一下,没想到还做出来通过了,这里分享一下。
整体思路:暴力用.substr()截取出每一个可能字符串(截取长度为1时直接放入set,set可以去重,还好用),然后依次判断截取的字符串是不是回文的,回文就放入set。就这么暴力,因为这里的字符串的长度为1≤len≤10^3。
下面是通过代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
using namespace std;
set<string>s;
int pd(string ss)//判断是否为回文串
{
int len=ss.length();
if(len%2)//奇数
{
for(int i=0;i<len/2;i++)
{
if(ss[i]!=ss[len-1-i])
{
return 0;
}
}
}
else
{
for(int i=0;i<len/2;i++)
{
if(ss[i]!=ss[len-1-i])
{
return 0;
}
}
}
return 1;
}
int main(void)
{
string ss;
cin>>ss;
for(int i=0;i<ss.length();i++)
{
for(int j=1;j<ss.length()-i+1;j++)
{
string s1=ss.substr(i,j);
if(s1.length()==1)
{
s.insert(s1);
}
else
{
if(pd(s1)==1)
s.insert(s1);
}
}
}
for(set<string>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
return 0;
}