題目:
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
1.暴力法
class Solution {
public String longestPalindrome(String s) {
String ans="";
int max=0;
//substring(i,j)
//i 起始索引-包括
for(int i=0;i<s.length();i++){
//j 结束索引 不包括
for (int j=i+1;j<=s.length();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;
}
public boolean isPalindromic(String s){
int len=s.length();
for(int i=0;i<len/2;i++){
if(s.charAt(i)!=s.charAt(len-1-i)){
return false;
}
}
return true;
}
}
时间复杂度:两层 for 循环 O(n²)O(n²),for 循环里边判断是否为回文 O(n)O(n),所以时间复杂度为 O(n³)O(n³)。
空间复杂度:O(1)O(1),常数个变量。
2.暴力法优化
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
boolean[][] P = new boolean[length][length];
int maxLen = 0;
String maxPal = "";
for (int len = 1; len <= length; len++) //遍历所有的长度
for (int start = 0; start < length; start++) {
int end = start + len - 1;
if (end >= length) //下标已经越界,结束本次循环
break;
P[start][end] = (len == 1 || len == 2 || P[start + 1][end - 1]) && s.charAt(start) == s.charAt(end); //长度为 1 和 2 的单独判断下
if (P[start][end] && len > maxLen) {
maxPal = s.substring(start, end + 1);
maxLen=maxPal.length();
}
}
return maxPal;
}
}