题目:给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
F1:暴力破解
思路:列举出所有子串,对子串进行回文判断.
暴力法思路比较简单,两个for循环列出所有子串然后调用判断回文方法.该方法在leetcode上超出时间限制,仅仅是一种思路,时间开销太大,请慎用.代码如下:
class Solution {
public int left=0;//初始化回文串的左边界
public int length=0;//初始化回文串的长度
public String longestPalindrome(String s) {
for (int i = 0; i < s.length(); i++) {
for (int j = i; j <s.length() ; j++) {
int temp=j-i+1;//当前子串的长度
if(palinHelper(i,j,s)&&temp>length){ //判断条件:是回文并且子串长度大于原来回文子串长度
length=temp;//更新回文子串长度
left=i;//更新回文子串左边界
}
}
}
return s.substring(left,left+length);
}
//判断是否回文
public Boolean palinHelper(Integer a,Integer b,String s){
while (a<=b){
if(s.charAt(a)!=s.charAt(b)){
return false;
}
a++;
b--;
}
return true;
}
}
- 时间复杂度O(n^3)
- 空间复杂度O(1)
F2:向左右两边发散法
思路:确定一个索引为枢轴向两边发散,寻找以该索引为枢轴形成的最大回文子串,并判断该回文子串是否值得更新.
寻找最大回文串分两种情况:1.回文串是奇数串,palinHelper(a,b,arrays)就令ab相等. 2.回文串是偶数串,palinHelper(a,b,arrays),b=a+1. 两种情况均进行考虑,取其大者.
代码如下:
class Solution {
public int left=0;
public int length=0;//初始化
public String longestPalindrome(String s) {
char[] array = s.toCharArray();//转成数组,减少时间开销
for (int i = 0; i < s.length(); i++) {
palinHelper(i,i,array);//回文子串为奇数串
palinHelper(i,i+1,array);//回文子串为偶数串
}
return s.substring(left, left + length);//左闭右开
}
//枢轴发散找最大回文串
public void palinHelper(Integer a,Integer b,char[] arrays){
int l=0;//临时变量记录当前回文串长度
while (a>=0&&b<arrays.length&&arrays[a]==arrays[b]){//循环条件:a、b没有越界,ab处值相等
l=b-a+1;
a--;
b++;
}
if(l>length){//更新
length=l;
left=a+1;
}
}
时间复杂度O(n^2)
空间复杂度O(n)
注意:
- String.substring()方法是左开右闭,右边界不取.
- String转成数组可以直接索引寻值,更快.
F3:动态规划
...还没学会...