2238"回文字串"报告
题目描述:
回文串,就是从前往后和从后往前看都是一样的字符串。那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串。
输入描述:
有且仅有一个仅包含小写字母的字符串,保证其长度不超过5000
输出描述:
有且仅有一个正整数,表示最长回文子串的长度
输入样例:
abccbxyz
输出样例:
4
分析:
我的算法算是比较暴力的。这道题目中,需要输出最长的回文字串的长度,我的想法是从最长的长度开始寻找是否有回文字串符合这个长度,如果没有,则从次长的长度寻找是否有符合长度的回文字串。比如说,给定abccbxyz,它们分别对应a[0]-a[7],我们先从长度最长,也就是8开始查找,然后从a[0]开始寻找,如果a[0]和它后面的第(0 + 8 - 1)个数字相等,那么这个数字可能是回文字串,此时,从a[0 + 1]和a[8 - 2]开始比较,也就是字符串往中间收,如果有一组对应的字符不相等,那么就不是回文字串,接着就从a[1]为起点开始和a[1 + 8 - 1]开始比较,之后的过程和前面一样,当找到符合长度的回文字串是,就可以输出这个长度,然后结束。需要注意的是,每一个回文字串的起点的范围是:0-p - k,其中p是总字符串的长度,k是要寻找的长度,因为一旦起点大于p-k,那么终点为p-k+k等于p,而数组是这个下标代表的是'\0'。接下来,代码就很容易写出来了。
代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[5001];
int k,l,p,flag1,flag2,i,j,m,flag,flag3;
scanf ("%s",a);
p = strlen(a);//算出字符串的长度
for (k = p; k >= 1; k--)//k为需要寻找符合长度的回文字串的长度,从后往前找
{
flag3 = 0;//标记是否找到了符合长度的回文字串
for (i = 0; i <= p - k; i++)//起点的范围从0到p-k
{
if(a[i] == a[i + k - 1])//起点和终点相等,就需要开始比较这个字串
{
flag = 1;
if(k > 3)//当字串长度小于等于3时,如果起点相等,那么一定是回文串,则不需要进行下面的操作
{
for (flag1 = i + 1,flag2 = i + k - 2,m = i + k / 2 - 1; flag1 <= m; flag1++,flag2--)//从起点和终点往中间收
{
if(a[flag1] != a[flag2])//有一组对应的不相等,则不是回文串
{
flag = 0;
break;
}
}
}
else//k <= 3,当字串长度小于等于3时,如果起点相等,那么一定是回文串
{
flag3 = 1;
break;
}
if(flag)
{
flag3 = 1;//当没有对应的不相等,那么是回文串,进行标记表示找到了
break;
}
}
}
if(flag3)//找到了最长的回文字串,输出该长度,结束
{
printf ("%d\n",k);
break;
}
}
return 0;
}
总结:这种算法比较好理解,但也比较复杂,因为其时间复杂度是O(n^2),能A是因为数据还不算太大~
2238"回文字串"报告的更多相关文章
- 求字符串的最长回文字串 O(n)
昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...
- hihocoder 第一周 最长回文字串
题目1 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程 ...
- POJ 3974 最长回文字串(manacher算法)
题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...
- 最长回文字串——manacher算法
时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...
- hdu 4632区间dp 回文字串计数问题
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- P1435 回文字串
P1435 回文字串 题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最 ...
- 「Luogu P1435」回文字串 解题报告
题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...
- UVA 11584 划分回文字串
将其划分为尽可能少的回文串 dp[i] = min(dp[i],dp[j] + 1) 来表示j+1~i是回文串 #include <iostream> #include <cs ...
- 【POJ3974】最长回文字串
在这里采用的是哈希+二分的方法. 根据回文串的性质可知,可以将回文分成奇回文和偶回文分别进行处理. 对于奇回文来说,每次枚举的端点一定是重合的,因此只需计算出端点左右公共的长度是多少即可,因此二分的是 ...
随机推荐
- MacBook使用之配置jdk&Eclipse
查看系统版本:关于本机-软件-查看当前版本信息 打开另一个Finder的快捷键:Command + n 终端命令:Finder - 使用工具 - 终端命令 配置jdk系统变量: cd ~ touch ...
- 测试class
各种断言方法: assertEqual(a,b) a == b assertNotEqual(a,b) a != b assertTrue(x) x == True assertFalse(x) x ...
- 数据库表间多对多关系(附带额外字段)的实体类(POJO 或 POCO)表示
介绍 在之前的 Entity Framework 快速上手介绍 之中,两个实体之间只是简单的一对一关系,而在实际的应用场景中,还会出现多对多关系,同时还有可能会出现多对多关系还附带有其他字段的情况. ...
- MysqlRouter 实现mysql5.6读写分离
下载,安装 [root@localhost src]# cd /usr/local/src/ [root@localhost src]# wget http://dev.mysql.com/get ...
- Java经典编程题50道之一
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? public class Example01 { publi ...
- Neo4j 第五篇:批量更新数据
相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...
- 腾讯AlloyTeam发布AlloyLever - 开发调试发布错误监控上报用户问题定位尽在1kb代码
AlloyLever [官网][Giuhub] 1kb(gzip)代码搞定开发调试发布,错误监控上报,用户问题定位. 支持错误监控和上报 支持 vConsole错误展示 支持开发阶段使用 vConso ...
- Iterator invalidation(迭代器失效)
一.vector 所有读操作.swap.std::swap:都不会引起迭代器失效... clear.operator=.assign:都会引起全部变量迭代器失效 reserve.shrink_to_f ...
- java音视频编解码问题:16/24/32位位音频byte[]转换为小端序short[],int[],以byte[]转short[]为例
前言:Java默认采用大端序存储方式,实际编码的音频数据是小端序,如果处理单8bit的音频当然不需要做转换,但是如果是16bit或者以上的就需要处理成小端序字节顺序. 注:大.小端序指的是字节的存储顺 ...
- Android React Native 开发环境搭建---windows下
环境搭建 环境搭建可以参考RN官网,也可以参考中文版本:http://reactnative.cn/docs/0.45/getting-started.html 如果你希望可以看到原版的安装流程,可以 ...