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 ... 
随机推荐
- maven仓库信息分析站点推荐
			maven是java的一个依赖,打包管理的工具,稍微大一点的java项目都需要使用maven. 随着java的壮大,maven仓库越来越大,仓库中的jar包有60多万,各种group,各种构件,各种版 ... 
- 《深入浅出Nodejs》—— 读后总结
			这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动 ... 
- Angularjs学习---官方phonecat实例学习angularjs step0 step1
			接下来一系列的文章都是学习https://docs.angularjs.org/tutorial的笔记,主要学习的angular-phonecat项目的实现,来介绍angularjs的使用. 1.下载 ... 
- SSIS Design6:利用数据流
			数据流利用内存来缓冲数据,并在内存中处理数据转换,由于内存的访问速度是非常快的,所以SSIS数据流转换性能是非常高效的.SSIS Engine将数据分批加载到内存中,当Data Flow将一批新的数据 ... 
- Sql Server系列:运算符和表达式
			运算符的一些符号,他们能够用于执行算术运算.字符串连接.赋值以及在字段.常量和变量之间进行比较.在SQL Server 2012中,运算符主要由以下6大类:算术运算符.赋值运算符.比较运算符.逻辑运算 ... 
- ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
			近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ... 
- 用扩展开发一个PHP类
			原文:http://my.oschina.net/mickelfeng/blog/122519?p=1 假设我们要用PHP扩展实 现一个类Person,它有一个private的成员变量$_name和两 ... 
- markdown语法练习
			Markdown练习 这篇文章 主要用于练习markdown各种基本语法. 这篇文章 主要用于练习markdown各种基本语法. 1.标题设置 1.通过在文字下方添加"="或者&q ... 
- java中动态代理实现机制
			前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ... 
- 新作《ASP.NET Web API 2框架揭秘》正式出版
			我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ... 
