No.005:Longest Palindromic Substring
问题:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
官方难度:
Medium
翻译:
给定一个字符串S,找出最长回文子串,你可以假定字符串的最大长度为1000,并且只有一个最长回文子串。
例子:
字符串:“cabccba”,最长回文子串为“abccba”。
- 寻找回文子串,明显不能将当前字符作为回文子串的第一个字符处理,应该将其看做回文子串的对称中心。
- 回文子串又分为奇数长度和偶数长度两种形式考虑。
- 奇数长度的回文子串,最小长度为1,以当前字符为中心,向两边辐射,遇到两边不相等或者字符串的首尾边界时,返回长度。
- 偶数长度的回文子串,最小长度为0,以当前字符和下一个字符为中心,向两边辐射。
- 有没有办法将以上两种形式,归纳地写成一个方法?其实是可行的,设定寻找字串长度的方法,传进去的入参,有一个对称左值和对称右值,奇数长度时,左值等于右值,以左值和右值为中心,记录扩张次数extendTime和回文长度count(每次加2),在退出方法时,对奇数长度的回文做count-1操作。
- 在退出方法之后,可以计算出回文开始索引位置startIndex,配合长度count,对原字符串做String.substring()方法,可以返回具体的回文。
- 在遍历进行到某个程度,可以直接退出,即在遍历过半之后,会出现当前的最大长度,大于接下来可能取到的最大理论值。
- 注意检查入参,不仅是空判断,题意还规定了最大长度1000的限制。
解题代码:
public static String longestPalindrome(String s) {
if (s == null || s.length() > 1000) {
throw new IllegalArgumentException("Input error");
}
char[] array = s.toCharArray();
// 最大回文子串长度和其开始位置索引
int maxLength = 0;
int startIndex = 0;
for (int i = 0; i < array.length; i++) {
// 超过字符串一半之后,理论上可能达到的最大长度小于当前的最大长度,直接退出循环
if (i > (array.length - 1) / 2 && 2 * (array.length - 1 - i) + 1 < maxLength) {
break;
}
// 分奇偶计算回文长度
int count1 = extend(array, i, i);
int count2 = extend(array, i, i + 1);
int count = Math.max(count1, count2);
if (count > maxLength) {
maxLength = count;
// 奇偶的startIndex可以统一成一个表达式
startIndex = i - (count - 1) / 2;
}
}
return s.substring(startIndex, startIndex + maxLength);
}
// 奇数回文和偶数回文统一处理
private static int extend(char[] array, int left, int right) {
// 回文长度和外扩次数
int count = 0;
int extendTime = 0;
// 外扩至超出数组范围
while (left - extendTime >= 0 && right + extendTime < array.length) {
// 不对称,直接跳出
if (array[left - extendTime] != array[right + extendTime]) {
break;
}
extendTime++;
count += 2;
}
// 奇数回文,最终长度减一
if (left == right) {
count--;
}
return count;
}
longestPalindrome
相关链接:
https://leetcode.com/problems/longest-palindromic-substring/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
No.005:Longest Palindromic Substring的更多相关文章
- Leetcode5:Longest Palindromic Substring@Python
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode5:Longest Palindromic Substring
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划
题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...
- LeetCode OJ:Longest Palindromic Substring(最长的回文字串)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LeetCode第五题:Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 【JAVA、C++】LeetCode 005 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
随机推荐
- Windows Azure Storage (21) 使用AzCopy工具,加快Azure Storage传输速度
<Windows Azure Platform 系列文章目录> Update 2016-09-28 想要在Azure云端,使用AzCopy工具,从Azure China 上海数据中心存储账 ...
- 优化MySchool数据库设计之【巅峰对决】
优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...
- web项目ajax技术一些总结
WEB项目中,最主要的就是前后端间的联络.有时需要不进行页面跳转的前提下请求后端方法(action),就需要用到ajax. 在这个博客中,我用到的都是原生的js的ajax,不是很喜欢用jquery的a ...
- 台式电脑、笔记本快捷选择Boot(启动项快捷键)大全
我们在安装系统时,会去设置电脑是从硬盘启动.U盘启动.光驱启动.网卡启动. 一般设置的方法有两种:一种是进BIOS主板菜单设置启动项顺序:另一种就是我在这里要介绍的快捷选择启动项. 以下是网友整理的各 ...
- Oozie分布式任务的工作流——Sqoop篇
Sqoop的使用应该是Oozie里面最常用的了,因为很多BI数据分析都是基于业务数据库来做的,因此需要把mysql或者oracle的数据导入到hdfs中再利用mapreduce或者spark进行ETL ...
- C#设计模式-享元模式
在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然 ...
- salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项
我们都知道,当一条记录进入审批流程以后会自动加锁,apex提供Approval类的lock和unlock方法可以让我们使用代码对记录进行加锁和解锁. 项目中遇到一个需求,需要当某种情况下对记录进行先解 ...
- iOS-网络处理
1.iOS-网络基础 2.iOS-网络处理框架AFN 3.iOS-网络爬虫
- 使用hexo搭建github.io博客(一)
使用github.io可以搭建一个自己的博客,把静态文件项目托管到github上,可以写博客,可以使用markdown语法,也可以展示作品.灵活性高.但是有较大的难度. node,git版本变化日新月 ...
- C#设计模式系列:代理模式(Proxy)
代理模式提供了一个中介控制对某个对象的访问.现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理. 1.代理模式简介 1.1>.定义 代理模式(Proxy)定义:代理模 ...