第五题 最长回文子串
官方提供了四种做法 本文中目前只举例第二种做法
后续在更新
第二种做法就是中心点法
原题
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
算法分析 O(n^2)
1、枚举中心点i 中心点的指针从中间向两边扩散
边界是l和r 区间长度确定是l+1 和 r-1 因为l和r这俩界限无法移动 区间长度r-1-1
分为两种情况: 字符串是奇数 字符串是偶数
情况一(奇数):l 和 r 两个端点是i-1 和i +1
没超出边界且l和r对应的字符相等
如果答案的回文子串没超出区间长度 截取
注意的是java中substring 是默认左闭右开的区间 且右边是end的意思
从l+1 开始出发 区间长度是r-l-1 到r-1 由于是右开区间 所以加一 所以右边到r
情况二同理
代码如下(示例):
class Solution {
public String longestPalindrome(String s) {
//以 l +1 到r-1 中间的回文串 那区间长度就是r-l-1 以i为中心的最长回文字符串
String res = new String() ;//答案的回文子串
for(int i = 0 ; i < s.length() ; i++){//枚举字符串的中心点i
//字符串如果为奇数
int l = i -1 , r = i + 1 ;//两个端点
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {//没出界并且二者相等
l -- ; r ++ ;
}
if(res.length() < r-l-1){
res= s.substring(l+1,r );
}
//如果为偶数
l = i ; r = i+1;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
l -- ; r ++ ;
}
if(res.length() < r-l -1 ) res = s.substring(l+1,r );//从l+1 到r-1
}
return res;
}
}