对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

思路一

由于字符串长仅1000,可以选择直接暴力找

思路二

套一下马拉车算法的模板即可

算法讲解:Here

Code Update:更新算法写法

// Murabito-B 21/04/23
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
string Manacher(string s) {
int len = s.size();
if (len < 1) return s;
string ss;
// 预处理
for (int i = 0; i < len; ++i) {
ss += '#';
ss += s[i];
}
ss += '#';
len = ss.size();
int MaxR = 0; // 当前访问到的所有回文子串,所能触及的最右一个字符的位置
int pos = 0; // MaxRight对应的回文串的对称轴所在的位置
int MaxRL = 0; // 最大回文串的回文半径
int MaxPos = 0; // MaxRL对应的回文串的对称轴所在的位置
int *RL = new int[len]; // RL[i]表示以第i个字符为对称轴的回文串的回文半径
memset(RL, 0, len * sizeof(int));
for (int i = 0; i < len; ++i) {
//1) 当i在MaxRight的左边
if (i < MaxR) RL[i] = min(RL[2 * pos - 1], MaxR - i);
else // 2) 当i在MaxRight的右边
RL[i] = 1; while (i - RL[i] >= 0 && i + RL[i] < len && ss[i - RL[i]] == ss[i + RL[i]])
RL[i]++; // 更新MaxRight, pos
if (RL[i] + i - 1 > MaxR) {
MaxR = RL[i] + i - 1;
pos = i;
}
// 更新MaxRL, MaxPos
if (MaxRL <= RL[i]) {
MaxRL = RL[i];
MaxPos = i;
}
}
return s.substr((MaxPos - MaxRL + 1) / 2, MaxRL - 1);
}
void solve() {
string s;
getline(cin, s);
cout << Manacher(s).size() << "\n";
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
solve();
return 0;
}
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
string s;
char s_new[4000];
int p[5000];
int Init() {
int len = s.length();
s_new[0] = '$';
s_new[1] = '#';
int j = 2;
for (int i = 0; i < len; i++) {
s_new[j++] = s[i];
s_new[j++] = '#';
}
s_new[j] = '\0'; // 别忘了哦
return j; // 返回 s_new 的长度
} int Manacher() {
int len = Init(); // 取得新字符串长度并完成向 s_new 的转换
int max_len = -1; // 最长回文长度
int id;
int mx = 0;
for (int i = 1; i < len; i++) {
if (i < mx)
p[i] = min(p[2 * id - i],
mx - i); // 需搞清楚上面那张图含义, mx 和 2*id-i 的含义
else
p[i] = 1; while (s_new[i - p[i]] ==
s_new[i + p[i]]) // 不需边界判断,因为左有'$',右有'\0'
p[i]++; // 我们每走一步 i,都要和 mx 比较,我们希望 mx
// 尽可能的远,这样才能更有机会执行 if (i < mx)这句代码,从而提高效率
if (mx < i + p[i]) {
id = i;
mx = i + p[i];
}
max_len = max(max_len, p[i] - 1);
}
return max_len;
} int main() {
getline(cin, s);
printf("%d\n", Manacher());
return 0;
}

思路三

没想到可以使用DP做,思路来自网络

动态规划:

分析:有两种可能,⼀种是回⽂字符串的⻓度为奇数,⼀种是偶数的情况。i为字符串当前字符的下 标。

     当回⽂字串为奇数的时候,j表示i-j与i+j构成的回⽂字串⻓度;当回⽂字串⻓度为偶数的时候,j表示

     i+1左边j个字符⼀直到i右边j个字符的回⽂字串⻓度~

     ⽤maxvalue保存遍历结果得到的最⼤值并且输出~
#include <iostream>
using namespace std;
int main() {
string s;
getline(cin, s);
int maxvalue = 0, temp;
int len = s.length();
for (int i = 0; i < len; i++) {
temp = 1;
for (int j = 1; j < len; j++) {
if (i - j < 0 || i + j >= len || s[i - j] != s[i + j])
break;
temp += 2;
}
maxvalue = temp > maxvalue ? temp : maxvalue;
temp = 0;
for (int j = 1; j < len; j++) {
if (i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j])
break;
temp += 2;
}
maxvalue = temp > maxvalue ? temp : maxvalue;
}
cout << maxvalue;
return 0;
}

L2-008 最长对称子串 (回文子串 / DP / Manacher算法)的更多相关文章

  1. HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...

  2. 回文串的Manacher算法

    Manacher算法较传统算法的优化之处在于它对每个回文中心寻找回文半径的时候并不是都从半径为1开始找的,而是利用前面已经完成的任务,寻找一个初始的开始搜索的半径大小,复杂度是线性的. 参考博客:ht ...

  3. 最长回文串(manacher算法)

    ; ; int p[N]; char str[LEN], tmp[N]; //p[i]表示以str[i]为中心的回文往右延伸的 最长长度 void manacher(char* str, int* p ...

  4. UVA 11584 Partitioning by Palindromes 划分回文串 (Manacher算法)

    d[i]表示前面i个字符划分成的最小回文串个数, 转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1. 要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处 ...

  5. 最长回文子串(Manacher算法)

    回文字符串,想必大家不会不熟悉吧? 回文串会求的吧?暴力一遍O(n^2)很简单,但当字符长度很长时便会TLE,简单,hash+二分搞定,其复杂度约为O(nlogn), 而Manacher算法能够在线性 ...

  6. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  7. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  8. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

  9. [译+改]最长回文子串(Longest Palindromic Substring) Part II

    [译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...

  10. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

随机推荐

  1. 链表K个节点的组内逆序调整问题

    链表K个节点的组内逆序调整问题 作者:Grey 原文地址: 博客园:链表K个节点的组内逆序调整问题 CSDN:链表K个节点的组内逆序调整问题 题目描述 LeetCode 25. Reverse Nod ...

  2. 3C智能移动周边产品龙头企业如何集成企业内部所有异构系统数据

    全面并自动集成品胜集团全域业务系统中的各类业务数据:结构化.标准化.自动化集团全部异构系统数据,提升全公司整体项目管理水平:梳理与简化跨部门.跨系统流程,清晰定义流程节点及业务边界,打通部门间信息流通 ...

  3. 【报错:For input string: ""报错: get connection error! 报错:java.lang.NullPointerException 报错:java.lang.NumberFormatException: For input string: "id"】解决方案

    原因:没有input数据进入,但是当我填写数据进入的时候 get connection error! 这个消息,是我要抛出去的异常,源代码下 我一开始觉得是代码书写的问题,找.......... 应该 ...

  4. 明解Java第二章练习题答案

    练习2-1 请对代码清单2-6的2处进行修改,将带有小数部分的实数值赋给x和y,查看结果如何? 答案:编译器会报错,因为小数的默认类型double是比int更大的类型.如果给double类型的变量赋值 ...

  5. socket链接和发送demo

    Socker 包是创建客户端的,用于链接服务器: ServerSocket 包是创建服务器的,启动端口进行监听等待链接 socket客户端-----------------java.lang.Stri ...

  6. MYSQL EXPLAIN 执行计划

    EXPLAIN 执行计划 有了慢查询语句后,就要对语句进行分析.一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方 ...

  7. 【开源项目推荐】-支持GPT的智能数据库客户端与报表工具——Chat2DB

    2023年是人工智能爆火的一年,ChatGPT为首的一系列的大模型的出现,让生成式人工智能彻底火了一把.但有人会说,GPT对于我们数据开发来说并没有什么作用啊? 今天为大家推荐的开源项目,就是GPT在 ...

  8. ubuntu 22.04搭建本地源

    ubuntu 22.04搭建本地源 基于服务器无法联网的情况下,从一台可以上网的服务器下载软件包和依赖,再在无法联网的服务器中搭建本地源,安装环境. 下载(包括依赖): cd /root mkdir ...

  9. 华企盾DSC苹果电脑右键菜单不显示问题

    1.检查认证的用户是否给了对应的权限(如:手动加密.手动解密.申请解密) 2.系统偏好设置--键盘--快捷键中开通的权限是否有勾选 3.系统服务中允许的菜单数超出了最大值

  10. ElasticSearch之Exists API

    检查指定名称的索引是否存在. 命令样例如下: curl -I "https://localhost:9200/testindex_002?pretty" --cacert $ES_ ...