最长回文子串
来源:互联网 发布:a卡优化的单机游戏 编辑:程序博客网 时间:2024/06/05 16:10
输入一个字符串,求出其中最大的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。
输入
输入字符串长度不超过5000,且占据单独的一行。
输出
输出最长的回文串,如果有多个,输出起始位置最靠左的。
样例输入
Confuciuss say: Madam,I?m Adam.
样例输出
Madam, I?m Adam
题目来源
刘汝佳《算法竞赛入门经典》
#include <iostream>//枚举回文串的中心(假设回文串的长度都是奇数的哈),然后从这个中心逐渐向两边扩展,直到不能扩展为止。
using namespace std;#define max 5001
int main ()
{
char s[max];
char new1[max];
int pos[max];
int len,i,j=0,k=0;
int maxs=0;
int st=0,end=0;
cin.get(s,max);
len=strlen(s);
for(i=0;i<len;i++) //预处理
if(isalpha(s[i]))
{pos[k]=i;
if(s[i]>=97)
{new1[k]=s[i]-32;
}
else
new1[k]=s[i];
k++;
}
for(i=0;i<k;i++) //回文字符数位奇数的情况
{
for(j=1;i+j<k&&j<=i;j++)
{
if(new1[i-j]!=new1[i+j])
break;
if(j*2+1>maxs)
{maxs=j*2+1;
st=pos[i-j];
end=pos[i+j];
}
}
for(j=0;j<=i&&i+j+1<k;j++) //回文字符数为偶数的情况
{ if(new1[i-j]!=new1[i+j+1])
break;
if(j*2+2>maxs)
{ maxs=j*2+2;
st=pos[i-j];
end=pos[i+j+1];
}
}
}
for(i=0;i<end-st+1;i++)
cout<<s[st+i];
cout<<endl;
return 0;
}
0 0
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 查询所有子栏目的表值函数
- 第三周 项目1 顺序表的基本运算
- ios实现锁屏解锁功能时候问题
- 【软考之路】软考视频总结(上)
- IOS自带地图中,小知识点总结
- 最长回文子串
- Java 异步处理简单实践
- nvidia显卡上OpenCL的hello world程序
- Hibernate(六)——多对多关联映射
- 委托使用示例
- 第三周项目二 建设“顺序表”算法库
- 第三周 顺序表的应用(1)
- log4j配置
- 数据挖掘十大经典算法之:决策树C4.5 分类算法