如果一个字符串正着读和倒着读是一样的,则称它是回文的。
给定一个长度为 N N N 的字符串 S S S,求字符串 S S S最长回文子串的长度是多少
输入:
abcbabcbabcba
输出:
13
输入:
abacacbaaaab
输出:
6
时间复杂度: O ( n 3 ) O(n^3) O(n3)
截取字符串的所有子串,然后再判断这些子串中哪些是回文的,最后返回回文子串中最长的即可。
使用两个变量,一个记录最长回文子串开始的位置,一个记录最长回文子串的长度,最后再截取。
截取所有子串,如果截取的子串小于等于之前遍历过的最大回文串,直接跳过。因为截取的子串即使是回文串也不可能是最大的,所以并不需要判断
//暴力求解
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string s, int start, int end) {
while (start < end) {
if (s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
int main()
{
string s;
cin >> s;
int maxLength = 0;
int n = s.length();
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
if (isPalindrome(s, i, j))
{
int length = j - i + 1;
if (length > maxLength)
maxLength = length;
}
}
}
printf("%d",maxLength);
return 0;
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
中心拓展法的思路是以每个字符为中心,向左右扩展,寻找回文子序列的长度
实现时,我们使用两个指针,分别指向当前字符或相邻两个字符,然后向两侧扩展。
以每个字符或相邻两个字符为中心,分别进行奇数和偶数长度的回文子序列的寻找。对于每个回文子序列,我们更新最长回文子序列的长度和起始位置。返回找到的最长回文子序列。
注意点:
代码:
#include <bits/stdc++.h>
using namespace std;
int expandAroundCenter(string s, int left, int right) {
while (left >= 0 && right < s.length() && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
int main()
{
string s ;
cin>>s;
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++)
{
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = max(len1, len2);
if (len > end - start)
{
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
printf("%d",end - start + 1);
return 0;
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
思路:利用已经计算过的子问题的结果来求解更大规模的问题
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.length();
vector<vector<bool>> dp(n, vector<bool>(n, false));
int maxLength = 1; // 最小回文子串长度为1
// 所有长度为1的子串都是回文子串
for (int i = 0; i < n; i++) {
dp[i][i] = true;
}
// 检查长度为2的子串
for (int i = 0; i < n - 1; i++) {
if (s[i] == s[i + 1]) {
dp[i][i + 1] = true;
maxLength = 2;
}
}
// 检查长度大于2的子串
for (int len = 3; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
if (s[i] == s[j] && dp[i + 1][j - 1]) {
dp[i][j] = true;
maxLength = max(maxLength, len);
}
}
}
printf("%d",maxLength);
return 0;
}
详情可见:
时间复杂度: O ( n ) O(n) O(n)
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=22000010;
char s[N],str[N];
int p[N]; //用于存放每个字符可以中心扩展几次
int init() //处理原字符串
{
int len=strlen(s);
str[0]='#'; str[1]='$'; //@是防止越界
int j=2;
for ( int i=0; i<len; i++ )
str[j++]=s[i],str[j++]='$';
str[j]='\0';
return j;
}
int manacher()
{
int ans=-1,len=init(),r=0,c=0;
for ( int i=1; i<len; i++ )
{
if ( i<= r ) p[i]=min( p[c*2-i],r-i ); //situation1
else p[i]=1; //situation2
while ( str[i+p[i]]==str[i-p[i]] ) p[i]++; //扩展
if ( p[i]+i> r )
{
r=p[i]+i;
c=i; //更新中心位置
}
ans=max(ans,p[i]-1 );
}
return ans;
}
int main()
{
int cnt=0;
while ( scanf( "%s",s) && s[0]!='E' )
printf( "Case %d: %d\n",++cnt,manacher() );
}
文章浏览阅读282次。wxWidgets:常用表达式wxWidgets:常用表达式不同风味的正则表达式转义Escapes元语法匹配限制和兼容性基本正则表达式正则表达式字符名称wxWidgets:常用表达式一个正则表达式描述字符的字符串。这是一种匹配某些字符串但不匹配其他字符串的模式。不同风味的正则表达式POSIX 定义的正则表达式 (RE) 有两种形式:扩展正则表达式(ERE) 和基本正则表达式(BRE)。ERE 大致是传统egrep 的那些,而 BRE 大致是传统ed 的那些。这个实现增加了第三种风格:高级正则表达式_wxwidget 正则表达式 非数字字符
文章浏览阅读3.4k次,点赞5次,收藏11次。Java中普通for循环和增强for循环的对比_for循环10万数据需要时间
文章浏览阅读2.7k次,点赞13次,收藏97次。0.工厂制作PCB线路板流程1.PCB的结构铜层阻焊丝印本质(PCB画电路板到底在画什么)基础工艺指标2.PCB图中的元素元素布局布线叠层设计3.PCB的设计依据原理图原理图元件库4.PCB的设计流程——总结_pcb端子设计基础知识
文章浏览阅读4.5k次,点赞5次,收藏19次。Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据_pandas excel list
文章浏览阅读4.6k次。在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计。下面是自己在分析nginx日志时常用命令的一些总结。1.利用grep ,wc命令统计某个请求或字符串出现的次数比如我要统计GET /task/showContent接口在某天的调用次数,则可以使用如下命令: cat _nginx的日志分析
文章浏览阅读5.4w次,点赞64次,收藏262次。使用Echarts绘制中国地图,其中地图点信息由JSON文件编写,前端html直接从JSON文件中读取地区数据,渲染到前端即可。详细介绍用到的各个功能!代码直接复制运行即可!_echarts中国地图
文章浏览阅读1.9w次,点赞50次,收藏366次。JVM常用性能调优参数详解 在学习完整个JVM内容后,其实目标不仅是学习了解整个JVM的基础知识,而是为了进行JVM性能调优做准备,所以以下的内容就是来说说JVM性能调优的知识。一、性能调优 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标发现性能瓶颈性能调优通过监控及数据统计工具获得数据确认是否达到目标二、何时进_jvm调优
文章浏览阅读435次,点赞3次,收藏7次。转载来源为https://blog.csdn.net/ReCclay/article/details/79439686 1、嵌入式系统的CPU主要使用的有DSP、ARM以及FPGA。2、DSP适用于数字信号处理的微处理器支持单指令多数据(DIMD)并行处理的指令显著提高音频、视频等数字信号的数据处理效率3、片上系统SOC已成为嵌入式处理器芯片的主流发展趋势它是..._八个gpio引脚最多构成几个按键
文章浏览阅读70次。magnum 是用于 OpenStack 的容器服务。它有以下特点:抽象的容器、节点、服务等集成了用于容器技术的Kubernetes和Docker集成了多租户安全的 Keystone继承了k8s多租户网络安全的 Neutron环境准备在VMware Workstations建台虚拟机,Ubuntu 14.04 LTS,..._openstack 安装好没有容器服务
文章浏览阅读420次。 HDU - 2209 翻纸牌游戏 当前的这张牌是否翻转取决于它的前一张牌是否朝上,如果朝上,不翻转,朝下,则翻转,这是贪心的思想,但是,对于第一张牌来说,它的前面没有牌了,所以可以翻转,也可以不翻转,分两种情况来判断,参考的别人的代码 #include<stdio.h>#include<algorithm>#include<string.h>u..._hdu 2209
文章浏览阅读2k次。很多小伙伴都遇到过win7系统因0xc0000005错误导致应用程序无法正常启动的困惑吧,一些朋友看过网上零散的win7系统因0xc0000005错误导致应用程序无法正常启动的处理方法,并没有完完全全明白win7系统因0xc0000005错误导致应用程序无法正常启动是如何解决的,今天小编准备了简单的解决办法,只需要按照1、右键点击要运行的软件或游戏,在右键菜单中选择“兼容性疑难解答”; 2、让系..._mysql 0xc0000005
文章浏览阅读492次。unix环境高级编程笔记_标准io创建空头文件