欢迎访问个人我的网站java
LeetCode:https://leetcode.com/problems/longest-palindromic-substring/git
LeetCodeCn:https://leetcode-cn.com/problems/longest-palindromic-substring/github
给定一个字符串 s,找到 s 中最长的回文子串。你能够假设 s 的最大长度为 1000。网站
示例 1:spa
示例 2:3d
感受暴力法什么的,能够再也不说了code
若是一个子串是回文,那么它本事是一个左右对称的形式,长度为n的子串,其中心有2n-1个,由于长度为偶数的子串,其中心可能在两个文字中间.接下来咱们只要依次查找每一个子串元素和两个元素中间做为回文子串的中心,记录其中最长的子串信息.cdn
在正式开始以前,咱们先看一下如何查找一个中心能匹配的回文最长长度是如何获得的.blog
前面提到,奇数长度的回文串和偶数长度的回文串其中心是不一样,在查找的过程当中咱们要分别区分两种状况来理解.leetcode
假设其长度为奇数,说明中心位置的元素无需和其它元素匹配(由于自己和自己必定相等),检测其左右相同长度的元素是否相等,以下图,假设中心位置是第1位的a,其左右元素相同,分别减小l和增长r,当时此时l = -1,并不合法,因此第1位做为中心的最长回文长度为3.
假设其长度为偶数,至关于其中心是一个空元素,也必定与自己相同,咱们直接检测其两侧的元素是否相同,步骤同上.
咱们将"babab"做为参数,此时start(最长子串的开始位置)默认为0,end(最长子串的结束位置)默认为0.
当咱们搜索第0位时,len(奇) = 1, len(偶) = 0,其最大回文子串长度为1,大于当前start和end之间的差.咱们须要更新statr和end的内容.end须要在i的基础上增长len/2,start须要在i的基础上减去(len - 1) /2,(防止偶数子串引发的越界问题).
咱们继续移动i,当i = 1时,此时其最长子串为3,更新start值为0,end值为2.
后边内容不重复, 由于每次计算相对来讲都是独立,只须要将此为获得的最长回文子串长度和已知的比对便可
public String longestPalindrome(String s) {
if (s == null || s.length() < 1){
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len = Math.max(isCenterNum(s, i , i), isCenterNum(s , i, i+1));
if (len > end - start){
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
//计算某位中中心的最长回文子串方法
public int isCenterNum(String s, int l, int r){
while (l >= 0 && r < s.length() && (s.charAt(l) == s.charAt(r))) {
l--;
r++;
}
return r - l - 1;
}
复制代码
相关代码欢迎你们关注并提出改进的建议