LeetCode5:最长回文子串(暴力-动态规划)
1、给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
方法1:暴力求解:
1、根据回文子串的定义,枚举所有长度大于等于 22 的子串,依次判断它们是否是回文。
2、记录最长回文子串时,可以只记录“当前子串的起始位置”和“子串长度”,不必截取。
3、复杂度分析:
时间复杂度:O(N^3),枚举字符串的左边界、右边界,然后继续验证子串是否是回文子串,这三种操作都与 N相关。
空间复杂度:O(1),只使用到常数个临时变量,与字符串长度无关。
/**
* 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
* 暴力匹配:时间复杂度:O(N^3)
* @param s
* @return
*/
public String longestPalindrome(String s) {
if(s.length() <2){
return s;
}
//记录最长回文子串的长度
int maxlen = 1;
char[] charArray = s.toCharArray();
int len = s.length();
int begin =0;
//枚举所有长度大于 1 的子串 charArray[i..j],并记录最长的回文子串
for(int i =0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(j-i+1>maxlen && valid(s,i,j)){
maxlen =j-i+1;
begin =i;
}
}
}
//不包括索引是begin+maxlen的这个字符
return s.substring(begin,begin+maxlen);
}
/**
* 验证子串 s[start,end] 是否为回文串
* @param s
* @param start
* @param end
* @return
*/
private boolean valid(String s,int start,int end){