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 ...
随机推荐
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...
- 花一分钟来看看Worktile是如何为团队协作而生的
团队协作,我们想的更深.更远.更多,花一分钟来看看我们特别奉献的故事,然后去注册一个账号,邀请小伙伴一起来工作,你会体会Worktile才是真正懂你的协作方式.
- 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章 继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...
- 【Prince2是什么】PRINCE2认证之Prince2衡量绩效的六大要素
之前一篇文章已经跟大家从体系上讲解了PRINCE2和PMP的差异,那接下来我们进行第二讲,PRINCE2中讲到的衡量绩效的要素是什么呢? 第一,成本:即项目必须是所能负担的起的 第二,时间:即项目 ...
- IOS关于LKDBHelper实体对象映射插件运用
一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, Mode ...
- HttpResponseMessage 调用.net web api
// // GET: /Home/ //释迦苦僧 public ActionResult Index() { HttpClient client = new HttpClient(); client. ...
- jquery插件编写模版
jquery插件是什么??这里以讨论实力方法为主,比如 $("div").pluginname({}); 他的最简单形势应该是 $.prototype.plugin = funct ...
- Android Fragment---执行Fragment事务
转载博客:http://blog.csdn.net/think_soft/article/details/7272853 在Activity中使用有关Fragment的添加.删除.替换以及用它们执行其 ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- java.util.NoSuchElementException: Timeout waiting for idle object
出现这个问题第一个想法就是连接池的参数设置问题,把最大连接数量设置大一些就行了,但是我就一个客服端访问服务器,连接池连接数量不可能会不够用.我的项目架构是spring mvc+hibernate,用s ...