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 最长对称子串的更多相关文章

  1. [刷题] PTA 7-61 找最长的字符串

    程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 81 4 5 int main() { 6 char ch[N ...

  2. leecode刷题(19)-- 最长公共前缀

    leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  3. L2-008. 最长对称子串(思维题)*

    L2-008. 最长对称子串 参考博客 #include <iostream> using namespace std; int main() { string s; getline(ci ...

  4. 团体程序设计天梯赛-练习集L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  5. pat 团体赛练习题集 L2-008. 最长对称子串

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  6. L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  7. 天梯杯 L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  8. c语言:最长对称子串(3种解决方案)

    问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法 ...

  9. L2-008 最长对称子串 (25 分) (模拟)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出 ...

随机推荐

  1. GO基础知识分享

    目录 GO基础知识分享 go语言的基本事项 关键字 字符串的拼接和变量的定义方式 空白符 const常量 iota的用法 运算符 Go 没有三目运算符,不能适用?: 语言条件语句 for循环的方式 函 ...

  2. Python 实现自动化 Excel 报表

    Py 实现自动化Excel报表 好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为工作成长的一部分哦. 最近有做一些报表, 但一直找不到一个合适的报表工具, 又实在不想写前 ...

  3. windows平台rust安装

    1.安装目录环境变量 RUSTUP_HOME D:\WorkSoftware\Rust\cargo CARGO_HOME D:\WorkSoftware\Rust\rustup 2.安装下载加速环境变 ...

  4. jenkins构建go及java项目

    jenkins构建go及java项目 转载请注明出处https://www.cnblogs.com/funnyzpc/p/14554017.html 写在前面 jenkins作为java的好基友,经历 ...

  5. IndexError: list index out of range Python常见错误

    引用超过list最大索引,此错误非常常见,注意列表的元素个数 ----------------------------------------------

  6. C++并发与多线程学习笔记--atomic

    std::atomic std::async std::atomic 一般atomic原子操作,针对++,--,+=,^=是支持的,其他结果可能不支持. 注意 std::atomic<int&g ...

  7. 使用Vanilla框架制作时间倒数器 ——JavaScript

    一.制作时间倒数器要求以及思路:   1.首先创建三个输入字段,分别是小时,分钟和秒,以及"开始"按钮.输入的初始值必须为0h 5m 0s.当用户输入小时,分钟和秒并单击" ...

  8. 这可能是最容易理解的 Go Mutex 源码剖析

    Hi,大家好,我是 haohongfan. 上一篇文章<一文完全掌握 Go math/rand>,我们知道 math/rand 的 global rand 有一个全局锁,我的文章里面有一句 ...

  9. day19.进程通信与线程1

    1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue 2 进程间通信:IPC -借助于Queue实现进程间通信 -借助于文件 -借助于数据库 -借助于消息队列:rabbitm ...

  10. JAVAEE_Servlet_12_获取前端页面请求方式 HttpServletRequest HttpServletResponse

    获取前端页面请求方式 * 前端页面发送的请求方式应该是后端服务器需要的请求方式保持一致,若不一致应该提示错误信息. * 获取到前端的请求方式之后通过if语句进行判断, if("GET&quo ...