最长回文串

              (1)思路

                        1. 因为字符串长度为奇数和偶数时处理方式不同,所以这里可以使用插入特殊字符的方法,使得每个字符串在处理之后长度都为奇数。处理方法为:在任意两个字符之间和字符串的开始和结尾插入'#'。(因为设字符为n个,那么共有n-1个间隙,n+(n-1)必然为奇数,再加上首尾'#'还是奇数)。因为要防止越界,所以在修改后的字符串首尾再加上边界,开始为'$',结尾为'@'

	private String chuli(String str) 
	{
		StringBuffer sb = new StringBuffer();
		
		sb.append('$');                   //加入开始标识
		for(int i=0; i<str.length(); i++)
		{
			sb.append('#');           //每个字符之前加入#
			sb.append(str.charAt(i));
		}
		sb.append('#');                  //末尾加入#
		sb.append('@');                  //加入结束符
		
		return sb.toString();
	}
                        测试:

		String str = "abba";
		str = chuli(str);
		for(int i=0; i<str.length(); i++)
			System.out.print(str.charAt(i)+" ");

                       结果为:

$ # a # b # b # a # @ 
                        2. 核心算法

                           1>定义数组p[i]:表示以str[i]为中心的最大回文串的长度(包含字符str[i]),pi表示已经求得的拥有最长回文串的字符的下标,mx表示最长回文串所能达到的最右边的边界
                           2>

                                

                             pi是最长回文串的中心(淡蓝色),如果以j为中心的最大回文串如上图所示,那么处于i处的情况和j处相同(因为pi的两侧是对称的)。这样求i的时候就可以利用j的结果了,此处显然j = 2*pi-i

                             mx是最长回文串的右边界,因为i<mx所以在求p[i],即以i为中心的回文串时,就可以利用关于pi的对称点j的信息。因为图中蓝色标志长度相同,均为mx-i,所以当mx-i>p[j],即图中所示情况时,p[i] = p[j],其余能不能再延长,就只能一个个字符判断了。

                           3>

                            

                            这种情况虽然mx>i,但是mx-i<p[j],也就是说最长回文串并没有全部包含以j为中心的回文串,所以此处最长只能选择mx-i为半径,即p[i] = mx-i

                           4>最后一种情况:mx-i<0,即i在最长回文串的外面,所以此时就只能从头开始算了,即p[i] = 1


              (2)代码

	@Test
	public void huiwen()
	{
		String str = "abba";
		str = chuli(str);
		
		int mx = 0;
		int pi = 1;
		int[] p = new int[str.length()];
		
		for(int i=1; i<str.length(); i++)  //因为已经将字符串第0个字符设置为$,所以直接从第1个开始
		{
			if(mx>i)                  //如果i在mx内,即可以利用以前求得的结果
			{
				if(mx-i>p[pi*2-i])             //整个i的对称点j = pi*2-i,都在最长回文串中
					p[i] = p[pi*2-i];
				else                           //一部分在最长回文串外
					p[i] = mx-i;
			}
			else                     //因为i在mx外,所以不能利用之前求得的结果,那么就直接设为1
				p[i] = 1;
			
			while(i-p[i]>0 && i+p[i]<str.length() && str.charAt(i+p[i])==str.charAt(i-p[i]))  //设置完p[i]的初始值之后,再一次扩展两边,看看是                                                                                                          //否能够将回文串扩大
				p[i]++;
			
			if(mx<i+p[i])              //如果当前求得的回文串长度大于之前最大的,那么更新最大值
			{
				mx = i+p[i]-1;    //i+p[i]-1为右边界
				pi = i;
			}
		}
		
		int maxLen = p[0];
		for(int i=1; i<p.length; i++)              //选出其中最长的半径
			maxLen = Math.max(maxLen, p[i]);
		
		System.out.println(maxLen-1);              //maxLen-1就是原字符串的最大回文串长度,下面证明
	}

              (3)注意

                        1.因为p[i]记录的是插入分隔符之后的回文串的半径,所以以i为中心的回文串的长度为2*p[i]-1.如bb->$#b#b#@,中间#的半径为3,所以回文串长度为2*3-1 = 5

                        2.因为#b#b#长度-1后,就正好是原来字符串长度的2倍,即((2*p[i]-1)-1)/2 = p[i]-1,得证。


51单片机基础知识 前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而 阅读详情

相关推荐

Matlab激活失败?手把手教你解决License checkout failed问题(附详细截图)

本文针对Matlab激活后出现“License checkout failed”错误的常见问题,提供了详细的解决方案。核心在于精准定位并正确填写Windows系统用户名,而非计算机名或账户全名。文章通过分步截图和命令指引,手把手教你使用`whoami`命令获取正确信息,并重新运行激活程序,从根本上解决因用户名填写错误导致的许可检查失败问题。

weixin_29062823的博客 576

题解:最长回文子串(4种解法)

题目:最长回文子串 难度:中等 一、描述 二、题解: 2.1 暴力法(O(N^3)) 解释: 循环三次。第一次起始点循环;第二次终止点循环(从最右边开始到起始点为止);第三次起始点开始终止点结束,当两个值不相等时候跳出循环。只有完整进行第三次循环才满足回文串的条件。 class Solution: def longestPalindrome(self, s: str) -> str: max_ = 1 max_str = s[0] length

v-space的博客 2万+

【DSP】【工程实战】从零构建C6678多核工程:CCS环境配置与启动模式详解

本文详细介绍了在CCS开发环境中从零构建TMS320C6678多核DSP工程的完整流程。内容涵盖KeyStone架构解析、工程创建、基础代码编写、链接命令文件配置、仿真器调试,并重点深入讲解了包括I2C EEPROM在内的多种一级启动模式原理与配置方法,为开发者提供了一套清晰、可复用的实战指南。

weixin_29164185的博客 420

笔试面试算法经典--最长回文子串

回文的定义正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”是“回文”,“abcde”和“ababab”则不是“回文”。字符串的最长回文子串,是指一个字符串中包含的最长的回文子串。例如“1212134”的最长回文子串是“12121”。下面给出了三种求最长子串的方法。解法1(中心扩展法)时间复杂度O(n^2),空间复杂度为O(1)。中心扩展法的思路是,遍历到数组的某一个元素时,以这

有图有真相 4万+

ADRV902x射频评估实战:手把手教你用TES GUI生成ARM bin与JESD204C配置文件

在射频前端系统设计中,ADRV902x系列收发器凭借其宽带性能和灵活配置能力,已成为5G基站、微波回传等场景的核心器件。然而当工程师面对非官方硬件平台时,如何高效利用Transceiver Evaluation Software(TES)完成关键配置,成为项目推进的第一道门槛。本文将彻底解析脱离ADS9母板后的完整离线工作流,从参数预设到文件生成,手把手解决真实工程中的配置痛点。在Demo模式下,所有硬件状态检测都会被跳过,但配置文件生成功能完全可用。作为基础模板,因其配置最为简洁,便于后续自定义修改。

weixin_33704591的博客 429

设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!

告别手动画图,提高效率~

楼下小黑哥 2万+

leetcode5. 最长回文子串

s.charAt(i)每次都会检查数组下标是否越界,所以最好先转化成字符数组 char[]arr=s.toCharArray 方法1:暴力解法: 就是暴力枚举,每截取到一个字符串就利用回文串判断函数(自己写的)来判断是不是回文串,并记录长度,输出最长的一个就好了 s.subString用起来呀 暴力解法在两个for循环中还做了遍历,因此,时间复杂度是O(n3) 方法2:枚举所有子串的可能的中心位置 中心扩散法:从中间位置开始,向两边扩散,直到不能匹配 需要分奇数长度和偶数长度,因为中心位置可能是一个字符

想握住此生辽阔 3688

Multisim 14.0元件库下载完整指南:从安装到配置

详细介绍Multisim 14.0版本的元件库下载方法,涵盖安装步骤与后续配置流程,帮助用户快速搭建仿真环境。内容覆盖常见问题及解决方案,让multisim元件库下载更高效、稳定。

weixin_34511754的博客 1937

(动态规划) 5. 最长回文子串 ——【Leetcode每日一题】

5. 最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

weixin_43412762的博客 4625

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

入,突破了数字接口的视频输入性能瓶颈,提供两倍于前代产品的视频输入能力。视频编解码引擎、视频图像处理的算法效果及性能得到了进一步提升。芯片为客户产品提供了高性能、优异图像质量。推理引擎,支持多种智能算法应用。合丰富的外围设备及高速接口,该。解决方案,广泛用于模拟高清。产品应用开发的新一代专。四核处理器和性能强大的。

szhorsway的博客 1011

【ROS学习笔记】13.ROS中的坐标管理系统

文章目录1 机器人中的坐标变换2 TF功能包TF坐标变换如何实现?TF的一个小案例3 小程序:小海龟跟随实验打开小程序查看当前的TF树坐标相对位置关系可视化1(tf_echo)坐标相对位置关系可视化2(rviz) 本节学习ROS中的坐标管理系统。 (部分图摘自:b站【古月居】古月·ROS入门21讲) 1 机器人中的坐标变换 机器人运动学的核心,描述任意两个坐标系之中任意两个向量之间的变换,可以用一个4×4的变换矩阵(Transformation Matrices)来描述它的平移和旋转变化。 变换矩阵中有包括

takedachia的博客 4338

如何求一个字符串最长的回文子串 三种方法 思路详解

如题示例 输入:s = "ababa" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 一道算法题,肯定思路最先想到的肯定是暴力解法,也是最简单的, 方法一 : 暴力破解 思路:列举字符串所有的子串,判断是否为回文数,在返回其中最大的一个 (代码已经运行通过,放心食用!) 现在我来解释一下: 这个很简单,len是代表着字符串s的长度,这里就是判断一下如果s为null或者长度为1,直接返回s就是其最大回文数了。注意一下,length()是String内一个方法,返回字符串的.

m0_65725614的博客 1万+

《嵌入式-STM32开发指南》第三部分 外设篇 - 第2章 温度传感器DS18B20

2.1 理论分析 2.1.1概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也就是只需占用主机一个I/O口,无需其他外围电路,直接将环境温度转换为数字信号,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。另外,以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量

不问归期的博客 8305

构造最长回文串

题意: 有n个长度为m的字符串, 把它们拼接在一起, 输出可能的最长回文串。 题目链接 思路: 用map记录字符串的个数,使用reverse函数得到它翻转之后的字符串,如果有反转后的字符串,就把它在最前拼面和最后面拼接上。用string的‘+’运算进行拼接。如果是单独的一个字符串,但是它是回文的,就把已经得到的字符串分成两半,还是要用string的'+"运算,因为确定长度的string访问下标会出错。 #pragma warning(disable:4996) #incl...

sunnyorrainy的博客 478

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

409 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 class Solution(object): ...

viviwong12的博客 3904

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

409最长回文串

一、前言 分类:Hash Table。 问题来源LeetCode 409 难度:简单。 问题链接:https://leetcode-cn.com/problems/longest-palindrome/ 二、题目 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长...

行走 228

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode最长回文串

最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 分析: 这道题目并不难,重点就是要能看出:构造回文串...

adressdeep的博客 162

[LeetCode] 409. 最长回文串

题目传送 问题描述 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入: “abccccdd” 输出: 7 解释: 我们可以构造的最长的回文串是”dccaccd”, 它的长度是 7。 我的想法 这道...

WhataNerd的博客 1678

js.最长回文串

我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。可以构造的最长回文串是"a",它的长度是 1。给定一个包含大写字母和小写字母的字符串。不能当做一个回文字符串。通过这些字母构造成的。在构造过程中,请注意。

露西西⭐的博客 493

409. 最长回文串

题目: 409. 最长回文串 题解: 1. 注意: 2. 思路1: 3. 思路2: 4. 思路3: 5. 坑点: 代码: /** * code409 */ public class code409 { public static int longestPalindrome(String s) { int a[] = new int[128]; ...

dev_zyx的博客 489

leetcode409. 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。 注意: 假设字符串的长度不会超过 1010。 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 思路:记录字符出现的次数,出现两次就可以对称放,对应的回...

少说,多做。 2715

Java实现 LeetCode 409 最长回文串

409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区...

5423
上一篇: O(n)选出第k小元素
下一篇: 快速排序的非递归实现
cpf2016
博客等级 码龄12年 24粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值