[刷题] PTA 7-64 最长对称子串
7-64 最长对称子串
我的代码:
1 #include<stdio.h>
2 #include<string.h>
3 #define N 1001
4
5 int main() {
6 char str[N];
7 int len;
8 gets(str);
9 len=strlen(str);
10 int i=0,j=0,sys=0,lng=1,temp=0;
11 for(i=2; i<len; i++) {
12 if(sys==0) {
13 j=i-2;
14 if(str[j]==str[i]) {
15 sys=1;temp=3;j--;
16 if(j<0) sys=0;
17 }
18 } else {
19 if(str[j]==str[i] && j>=0) {
20 temp+=2;j--;
21 } else {
22 sys=0;
23 }
24 }
25 if(temp>lng) lng=temp;
26 }
27 sys=0;temp=0;
28 for(i=1; i<len; i++) {
29 if(sys==0) {
30 j=i-1;
31 if(str[j]==str[i]) {
32 sys=1;temp=2;j--;
33 if(j<0) sys=0;
34 }
35 } else {
36 if(str[j]==str[i] && j>=0) {
37 temp+=2;j--;
38 } else {
39 sys=0;
40 }
41 }
42 if(temp>lng) lng=temp;
43 }
44 printf("%d",lng);
45 }
(一个用例通不过)
思考过程:
数组存储字符串,指针i从头遍历
str[i-2]==str[i],若相等则记录对称串的长度,同时指针j从i-2开始向后遍历
两个指针所指内容不相等时停止遍历,更新对称串的长度
奇数情况
变量:
字符数组str
指针i、j
状态变量sys——当前对称串是否在增长
temp——当前对称串长度
lng——当前最长对称串长度
细节:
i从2开始遍历,按照sys的状态分两种情况
若sys==1,判断str[i]==str[j],若是则temp+=2,j--;
若否或j<0则sys=0,跳出 15
若sys==0,判断str[i]==str[i-2],若是则sys=1,j-- 16
更新lng
边界:
调试:
a 1
aba 3
abcba 5
ababa 5
a a 3
偶数情况
奇偶切换
性能优化
大神的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
char str[1010];
gets(str);
int maxn=0,tmp;
int len = strlen(str);
string str;
getline(cin,str);
int len = str.length();
for(int i=0;i<len;i++)
{
tmp = 1;//奇数时的情况,tmp不同呀!!!
for(int j=1;j<=len;j++)
{
if(i-j<0 || i+j>=len || str[i-j]!=str[i+j])
break;//不满足条件了,就跳过,此时的tmp就是i中最长字符串
tmp += 2;
}
maxn = max(maxn,tmp);
tmp = 0;//偶数时的情况
for(int j=1;j<=len;j++)
{
if(i+1-j<0 || i+j>=len || str[i-j+1]!=str[i+j])
break;
tmp += 2;
}
maxn = max(maxn,tmp);
}
cout << maxn << endl;
return 0;
}
差距:
1、过于侧重从流程层面思考问题,而不是从逻辑层面思考问题
[刷题] PTA 7-64 最长对称子串的更多相关文章
- [刷题] PTA 7-61 找最长的字符串
程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 81 4 5 int main() { 6 char ch[N ...
- leecode刷题(19)-- 最长公共前缀
leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- L2-008. 最长对称子串(思维题)*
L2-008. 最长对称子串 参考博客 #include <iostream> using namespace std; int main() { string s; getline(ci ...
- 团体程序设计天梯赛-练习集L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- pat 团体赛练习题集 L2-008. 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- 天梯杯 L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- c语言:最长对称子串(3种解决方案)
问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法 ...
- L2-008 最长对称子串 (25 分) (模拟)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出 ...
随机推荐
- OxyPlot.SkiaSharp显示中文乱码的问题
oxyplot 图表控件功能强大,使用很广泛.最近考虑到性能使用OxyPlot.SkiaSharp替代OxyPlot.WPF,曲线图表初步测试,性能提升近10倍左右.基于SkiaSharp图形引擎的一 ...
- 从wav到Ogg Opus 以及使用java解码OPUS
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码.PCM通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字编码. 采样率 采样频率,也称为采样速度或 ...
- 面试官问PHP四大主流框架的优缺点,看这篇就够了!
本篇文章我们来讲讲PHP四大框架的优缺点都有哪些,让你们在开发中更好的去选择使用哪款PHP框架去完成项目,废话不多说,我们一起来看看吧!! ThinkPHP ThinkPHP(FCS)是一个轻量级的中 ...
- 【剑指offer】7:斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...
- Spring(五)Spring与Web环境集成
MVC 是 Model.View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责. 模型:用于存储数据以及处理用户请求的业务逻辑. 视图:向控制器提交数据,显示模型中的数 ...
- Hadoop完整搭建过程(四):完全分布模式(服务器)
1 概述 上一篇文章介绍了如何使用虚拟机搭建集群,到了这篇文章就是实战了,使用真实的三台不同服务器进行Hadoop集群的搭建.具体步骤其实与虚拟机的差不多,但是由于安全组以及端口等等一些列的问题,会与 ...
- (十一)Docker-DinD
1. Docker in Docker Step 1. Start a daemon instance $ docker run --privileged --name some-docker -d ...
- 2021S软件工程——案例分析作业
2021S软件工程--案例分析作业 18231169 黄思为 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任建) 这个作业的要求在哪里 案例分析作业 我在这个课程的目标是 了解并熟悉 ...
- E - Level K Palindrome
题目大意: As a token of his gratitude, Takahashi has decided to give Snuke a level-KK palindrome. A leve ...
- 5. Linux常用命令
clear命令: 作用:清屏 快捷键:Ctrl + L pwd命令: 作用:用于显示当前的工作路径位置(当前工作文件夹) 示例: $ pwd /home/tarena Linux/Unix下的路径: ...