近似回文串、最长回文子串
来源:互联网 发布:球球大作战圣衣软件 编辑:程序博客网 时间:2024/06/06 18:25
输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:
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
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
该题解题思路类似于求一个字符串的最长回文子串,只是他允许2*k个地方不同。
求最长回文子串的代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=1005;int main(){ char str[N]; while(~scanf("%s",str)) { int len=strlen(str); int maxlen=0,start=0; for(int i=0;i<len;i++) { int j; for(j=0;j<=i&&j+i<len;j++)//判断ababa类型的回文串 { if(str[i-j]!=str[i+j]) break; } --j; if(2*j+1>maxlen) { maxlen=2*j+1; start=i-j; } for(j=0;j<=i&&j+i+1<len;j++)//判断abaaba类型的回文串 { if(str[i-j]!=str[i+j+1]) break; } --j; if(j<0) continue; if(2*j+2>maxlen) { maxlen=2*j+2; start=i-j; } } for(int i=start;i<start+maxlen;i++) printf("%c",str[i]); printf("\n"); printf("%d\n",maxlen); } return 0;}求近似回文串的代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=1005;int main(){ int pos[N]; char str[N]; char as[N],bs[N]; int k,cas=1; while(~scanf("%d",&k)) { getchar(); memset(as,0,sizeof(as)); memset(bs,0,sizeof(bs)); memset(pos,0,sizeof(pos)); gets(str); int len=strlen(str); int j=0; for(int i=0; i<len; i++)//得到纯字母的字符串 { if(isalpha(str[i])) { pos[j]=i;//记录在原字符串中的位置 as[j++]=tolower(str[i]); } } int maxlen=0,start=0,l; for(int i=0; i<j; i++) { int cnt=0; for(l=0; l<=i&&i+l<j; l++)//判断ababa类型 { if(as[i-l]!=as[i+l])//记录不同的个数。 cnt++; if(cnt>k) { break; } } --l;//退回到上一次相同的地方 if(pos[i+l]-pos[i-l]+1>maxlen)//在原字符串中的距离大于maxlen { maxlen=pos[i+l]-pos[i-l]+1; start=pos[i-l]; } cnt=0; for(l=0; l<=i&&i+l+1<j; l++)//判断abaaba类型 { if(as[i-l]!=as[i+l+1]) cnt++; if(cnt>k) { break; } } --l; if(l<0) continue; if(pos[i+l+1]-pos[i-l]+1>maxlen) { maxlen=pos[i+l+1]-pos[i-l]+1; start=pos[i-l]; } } printf("Case %d: %d %d\n",cas++,maxlen,start+1); } return 0;}
阅读全文
0 0
- 近似回文串、最长回文子串
- 最长回文子串的变形 && csu1328: 近似回文词
- CSU1328 近似回文词(字符串处理,最长回文子串)
- CSU 1328 近似回文词(最长回文子串变形)
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- JavaScript入门(二)
- python中decode和encode的区别和联系
- textview显示HTML中img的图片
- hdu 2821
- 断言(assert)表达式的使用
- 近似回文串、最长回文子串
- 7 款 Python 数据图表工具的比较
- netty学习十二:了解NIO Buffer中的postion和capacity和limit
- HDU 6150 Vertex Cover (有趣的构造)
- 搭建ionic项目环境并开始第一个demo
- oracle 把A用户所有表的查看权限赋给B用户(批量赋权)
- effective C++条款十九解读
- Eexecutor异步执行框架
- Paired Up