最长回文子串
LeetCode题库 第5题
给定一个字符串 s,找到 s 中最长的回文子串
回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。
示例 1:
输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd” 输出: “bb”
代码
一:暴力求解
在这里插 /**
* O(n^3)时间复杂度方法——暴力求解
* 1.思想:
* 1)从最长的子串开始,遍历所有该原字符串的子串;
* 2)每找出一个字符串,就判断该字符串是否为回文;
* 3)子串为回文时,则找到了最长的回文子串,因此结束;反之,则继续遍历。
* 2.时间复杂度解释:
* 遍历字符串子串:嵌套一个循环、O(n^2);
* 判断是否为回文:再次嵌套一个循环、O(n^3)。
*/
public static String longestPalindrome(String s) {
if (s.length() <= 1)
return s;
for (int i = s.length(); i > 0; i--) {//子串长度,从最长子段开始,若是回文子串,就可以直接返回
for (int j = 0; j <= s.length() - i; j++) { //根据子串长度,限制应该截取的子串在s中的开头位置
String sub = s.substring(j, i + j);//子串位置 i子串长度 j为起始位置 截取的范围就从j 到 j+i substring左闭右开
int count = 0;//计数,用来判断是否对称
for (int k = 0; k < sub.length() / 2; k++) {//左右对称判断
if (sub.charAt(k) == sub.charAt(sub.length() - k - 1)) {
count++;
} else {
break;
}
}
if (count == sub.length() / 2)
return sub;
}
}
return "";//表示字符串中无回文子串
}
二:中心扩展解法
/**
* "bbcbcadd"
* 分两种情况 回文子串为单核回文 例 “aba” 双核回文 例 “abba”
*/
private static String sub = "";
private static int length = 0;
public static String longestPalindrome1(String s) {
if (s.length() <= 1)
return s;
for (int i = 0; i < s.length() - 1; i++) {//除去字符串最后一个字符之外的所有字符
findLongestPalindrome1(s, i, i);//单核回文查询
findLongestPalindrome1(s, i, i + 1);//双核回文查询
}
return sub;
}
private static void findLongestPalindrome1(String s, int left, int right) {
while (left >= 0 && right <= s.length() - 1) {
if (s.charAt(left) == s.charAt(right)) {
if(length < right-left+1){
length = right-left+1;
sub = s.substring(left,right+1);
}
left--;
right++;
}else{
break;
}
}
}