大家好,我是java小豪,很高心能在这里与大家相遇,共同交流技术
5、最长回文子串
【题目描述】
给你一个字符串s,找到s中最长的回文子串
【示例输入】
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
【思路】
一、暴力破解
列举所有的⼦串,判断是否为回⽂串,保存最⻓的回⽂串
二、 最⻓公共⼦串
申请⼀个⼆维的数组初始化为 0,然后判断对应的字符是否相等,相等的话 arr [ i ][ j ] = arr [ i - 1 ][ j - 1] + 1 。 当 i = 0 或者 j = 0 的时候单独分析,字符相等的话 arr [ i ][ j ] 就赋为 1 。 arr [ i ][ j ] 保存的就是公共⼦串的⻓度。
【解法一】:暴力破解(时间超限)
class Solution {
public boolean isPalindromic(String s) {
int len = s.length();
for (int i = 0; i < len / 2; i++) {
if (s.charAt(i) != s.charAt(len - i - 1)) {
return false;
}
}
return true;
}
public String longestPalindrome(String s) {
String ans = "";
int max = 0;
int len = s.length();
for (int i = 0; i < len; i++) {
for (int j = i + 1; j <= len; j++) {
String test = s.substring(i, j);
if (isPalindromic(test) && test.length() > max) {
ans = s.substring(i, j);
max = Math.max(max, ans.length());
}
}
}
return ans;
}
}
【解法二】:最长公共子串
class Solution {
public String longestPalindrome(String s) {
if (s.equals(""))
return "";
String origin = s;
String reverse = new StringBuffer(s).reverse().toString();
int length = s.length();
int[][] arr = new int[length][length];
int maxLen = 0;
int maxEnd = 0;
for (int i = 0; i < length; i++)
for (int j = 0; j < length; j++) {
if (origin.charAt(i) == reverse.charAt(j)) {
if (i == 0 || j == 0) {
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
}
if (arr[i][j] > maxLen) {
int beforeRev = length - 1 - j;
if (beforeRev + arr[i][j] - 1 == i) { //判断下标是否对应
maxLen = arr[i][j];
maxEnd = i;
}
}
}
return s.substring(maxEnd - maxLen + 1, maxEnd + 1);
}
}
复杂度分析:
● 时间复杂度:两层循环,O(n²)。
● 空间复杂度:⼀个⼆维数组,O(n²)。