csu-1328 近似回文词 和 最长回文字符串
原博文地址: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
跟上题的区别在于这里可以有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 近似回文词 和 最长回文字符串的更多相关文章
- CSU 1328 近似回文词【最长回文字符串(三种方法)】
输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把 ...
- CSU 1328: 近似回文词
省赛的A题...现场都没什么人做...其实就一暴力水题......坑死了... 1328: 近似回文词 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1 ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- hdu 3068 最长回文(manacher&最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 51NOD 1088 最长回文子串&1089 最长回文子串 V2(Manacher算法)
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...
- HDU 3068 最长回文 (Manacher最长回文串)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输 ...
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...
- Vijos1327回文词【动态规划】
回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符 ...
- 回文词_KEY
回文词 (palin.pas/c/cpp) [问题描述] 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得的结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个 ...
随机推荐
- OpenShift应用镜像构建(2) - 链式构建
Openshift对于应用构建提供了三种模式 从应用的源代码构建并部署,Openshift通过一个S2I的构建过程编译打包并实现发布,具体可以参考 https://www.cnblogs.com/er ...
- material.setTexture("sampler",tex) assetbundle 下失效
做镜面反射本来写很顺 在手机上测的时候 发现settexture这里绑不上 查好久 是assetbundle的缘故 因为动态加载的 obj用了mat01 我在反射脚本里动态修改mat01而不是拿 re ...
- ISP图像调试工程师——自动对焦(熟悉3A算法)
https://wenku.baidu.com/view/40ec4a14fc4ffe473368ab96.html
- jquery获取一组相同标签内没有class的标签
$("ul>li[class!='pre'][class!='nex']").each(function(i){ $(this).html(i); });
- http网络通信--页面源代码查看
1.要在andorid中实现网络图片查看,涉及到用户隐私问题,所以要在AndroidManifest.xml中添加访问网络权限 <uses-permission android:name=&qu ...
- 如何使用 awk 输出文本中的字段和列
首先我们要知道,awk 能够自动将输入的行,分隔为若干字段.每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来. 如果你熟悉 Unix/Linux 或者懂得 bash shell 编 ...
- dubbo-monitor安装监控中心,管理控制台安装
一.安装监控中心 1.创建安装目录 2.解压 上传文件解压文件 解压 3.修改配置文件 4.启动 如果一直出现点.只需要加大内存即可,内存至少大于1024,然后reboot重启 5.测试 二.安装管理 ...
- 服务端REST与SOAP的探讨
REST简介 在开始我们的正式讨论之前,让我们简单看一下REST的定义. REST(Representational State Transfer)是Roy Fielding提出的一个描述互联系统架构 ...
- C/C++中传值和传地址(引用)
C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如: void swap_by_value(int a, int b) { in ...
- 偶遇RecyclerView内部Bug
写在前面 最近忙着赶项目进度,都不知道这次博客写点啥好了,前两天碰巧遇到一个奇怪的bug,项目中未发现与异常相关的类,于是去百度.谷歌搜索,发现这是一个早就可能被写烂吐槽的Recy ...