原博文地址:http://blog.csdn.net/u012773338/article/details/39857997

最长回文子串

描述:输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符 串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首 尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。

输入 :每行有一个字符串。

输出 :输出所要求的回文子串。

样例输入:    Confuciuss say:Madam,I'm Adam.

样例输出  :  Madam,I'm Adam

思路:

1,用gets或者fgets读入完整的一行,

2,预处理构造一个新的字符串,不包含原来的标点符号,并且把所有字母变成大写。用s数组保存。

3,枚举每个回文串的中间位置i,然后不断向外扩展,直到有字符不同,但是长度为奇数和偶数的处理方式是不一样的,比如aba,abba。

回文串为奇数时,从第i个向左(i-j)向后(i+j)遍历,为偶数时,从第i个向左(i-j)向右(i+j+1)遍历。不想等就退出。

4,不断更新最大回文串长度,并且用一个数组p保存最大回文串在原串的起始位置和结束位置。

代码:

 #include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 5000 + 10
char buf[MAXN], s[MAXN];
int p[MAXN];
int main()
{
int n,m=,maxn=,x,y,i,j;
fgets(buf,sizeof(s),stdin);//s肯定是一个字符数组。该调用从标准输入流stdin(也就是键盘输入)
n=strlen(buf); //读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中(前提是buf已经申请好空间了)
for(i=;i<n;i++)
{
if(isalpha(buf[i])) //判断字符i是否是字母用到了isalpha这个函数
{
p[m]=i; //把字母在原串的初始位置保存
s[m++]=toupper(buf[i]); //转化成大写字母用s数组保存
}
}
for(i=;i<m;i++)
{
for(j=;i-j>=&&i+j<m;j++) //枚举奇数的回文串 注意下标的变换
{
if(s[i-j]!=s[i+j]) break;
if(j*+>maxn) {maxn=j*+;x=p[i-j];y=p[i+j];} //回文串的长度为2*j+1,比如aba,记录起始位置和终止位置
}
for(j=;i-j>=&&i+j+<m;j++) //枚举偶数的回文串
{
if(s[i-j]!=s[i+j+])break;
if(j*+>maxn) {maxn=j*+;x=p[i-j];y=p[i+j+];} //长度为2*j+2,比如abba,
}
}
for(i=x;i<=y;i++)
printf("%c",buf[i]); //输出最长回文串
printf("\n");
return ;
}

csu-1328 近似回文词

1328: 近似回文词

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 312  Solved: 118
[Submit][Status][Web
Board
]

Description

输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:

1. S以字母开头,字母结尾

2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串。

比如当k=1时,Race cat是一个近似回文词,因为a(S)=racecat和b(S)=tacecar只有2个位置不同。

Input

输入包含不超过25组数据,每组数据包含两行。第一行是整数k(0<=k<=200),第二行为字符串S,包含至少一个字母但不超过1000个字符(换行符不算)。S只包含字符、空格和其他可打印字符(比如逗号,句号),并且不会以空白字符开头。

Output

对于每组测试数据,输出最长近似回文子串的长度和起始位置(S的第一个字符是位置1)。如果有多个最长近似回文子串解,起始位置应尽量小。

Sample Input

1
Wow, it is a Race cat!
0
abcdefg
0
Kitty: Madam, I'm adam.

Sample Output

Case 1: 8 3
Case 2: 1 1
Case 3: 15 8

HINT

 

Source

[Submit][Status][Web Board]

跟上题的区别在于这里可以有2*k个字符不同,那处理的时候只要另外设置一个标志变量ans,当ans>k 就跳出即可,还要注意一些细节的处理,特别是枚举偶数的近似回文串的时候,如果j==0即没有满足题目条件的近似回文串,那么应该不能更新最大值,因为 ab不是回文串,最大长度只能是1。其他的就是一样。

代码:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 1000 + 10
char buf[MAXN], s[MAXN];
int p[MAXN];
int main()
{
int k,n,m,maxn,x,y,i,j,l=,cas,start;
while(scanf("%d",&k)!=EOF)
{
getchar();
fgets(buf,sizeof(s),stdin);//s肯定是一个字符数组。该调用从标准输入流stdin(也就是键盘输入)
n=strlen(buf);
m=maxn=;
start=-; //读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中(前提是buf已经申请好空间了)
for(i=;i<n;i++)
{
if(isalpha(buf[i])) //判断字符i是否是字母用到了isalpha这个函数
{
p[m]=i; //把字母在原串的初始位置保存
s[m++]=tolower(buf[i]); //转化成大写字母用s数组保存
}
}
//s[m]=0;
for(i=;i<m;i++)
{
for(cas=j=;i-j>=&&i+j<m;j++) //枚举奇数的近似回文串
{
if(s[i-j]!=s[i+j]) cas++;
if(cas>k) break;
}
j--;
if(p[i+j]-p[i-j]+>maxn) {maxn=p[i+j]-p[i-j]+; start=p[i-j];}
for(cas=j=;i-j>=&&i+j+<m;j++) //枚举偶数的近似回文串
{
if(s[i-j]!=s[i+j+])cas++;
if(cas>k) break;
}
j--;
if(j<=-) continue;
if(p[i+j+]-p[i-j]+>maxn) {maxn=p[i+j+]-p[i-j]+; start=p[i-j];}
}
printf("Case %d: %d %d\n",l++,maxn,start+); }
return ;
}

csu-1328 近似回文词 和 最长回文字符串的更多相关文章

  1. CSU 1328 近似回文词【最长回文字符串(三种方法)】

    输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...

  2. CSU 1328: 近似回文词

    省赛的A题...现场都没什么人做...其实就一暴力水题......坑死了... 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1 ...

  3. hdu 3068 最长回文(manachar求最长回文子串)

    题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...

  4. hdu 3068 最长回文(manacher&amp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. 51NOD 1088 最长回文子串&1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...

  6. HDU 3068 最长回文 (Manacher最长回文串)

    Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输 ...

  7. CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...

  8. Vijos1327回文词【动态规划】

    回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符 ...

  9. 回文词_KEY

    回文词 (palin.pas/c/cpp) [问题描述] 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个 ...

随机推荐

  1. CSS -- 文字竖直居中

    元素的height 和 lineheight 设置为一样即可.

  2. Netty游戏服务器之四protobuf编解码和黏包处理

    我们还没讲客户端怎么向服务器发送消息,服务器怎么接受消息. 在讲这个之前我们先要了解一点就是tcp底层存在粘包和拆包的机制,所以我们在进行消息传递的时候要考虑这个问题. 看了netty权威这里处理的办 ...

  3. Flask如何使用https?

    1 安装python 的 openssl 的类库 pip install pyOpenSSL 2 在 Flask 的代码中可以直接使用,注意ssl_context的值必须是adhoc from fla ...

  4. mr程序无法输出日志进行调试的解决方法

    mr程序无法输出日志进行调试的解决方法 @(Hadoop) yarn开启日志输出设置 在yarn-site.xml文件中添加如下配置: <property> <name>yar ...

  5. openwrt web server

    刚刚群里又个同学问PHP页面放到哪个文件夹下. 我一想那得apache呀,于是我说你得先看自己的路由器能不能装的下apache. 但是回头他又问,那openwrt的页面怎么弄的? 我一时语塞,于是就百 ...

  6. Android avd XDM authorization key matches an existing client

    在启动 android avd 调试程序的时候,突然出现这个错误; XDM authorization key matches an existing client avd 怎么也启动不起来.网上搜也 ...

  7. HTTP状态码具体解释

    HTTP状态码(HTTP Status Code)是用以表示网页serverHTTP响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到RFC 2518.RFC 2817.RFC 229 ...

  8. nginx安装说明

    下载地址:http://nginx.org/en/download.html 安装版本:1.10.0 安装配置如下: /etc/nginx 目录 /home/nginx目录 --prefix=/hom ...

  9. 虚拟机快照,克隆,静态ip地址的设置(centos 6.5)

    一.快照 例如,当我们在虚拟机上做实验或是作测试时,难免碰到一些不熟悉的地方,此时做个快照,备份一下当前的系统状态,一旦操作错误,可以很快还原到出错前的状态,完成实验,最终避免一步的失误导致重新开始整 ...

  10. Fedora 28 设置yum代理

    编辑  vi /etc/dnf/dnf.conf 文件 添加一行代理设置:proxy=http://****:****