题目:最长回文子串
思路:
- 特判:过滤掉空字符串的情况
- 初始化:
- 定义一个变量
maxLen
表示最长字符串长度,begin
表示最长字符串首字符的位置; - 定义一个二维动态数组
dp
,dp[i][j]
表示从第i个字符开始到第j个字符结尾的字符串是否为回文字符串,初始条件就是每个字符都是一个回文字符串,也就是dp[i][i] = true
;
- 利用i,j两个指针遍历整个字符串,填满整个动态数组的状态值,取值范围为
j: [1,len)
;i: [0,j)
s_i 不等于 s_j
==>false
;s_i 等于 s_j
==> i和j中间是否为空,为空则true
;不为空,则取决于中间字符串是否为回文字符串的状态值;- 更新
maxLen
和begin
;
- 返回
class Solution {
public String longestPalindrome(String s) {
//特判
if(s == null || s.length() == 0) return "";
//初始化
int maxLen = 1;
int bengin = 0;
int len = s.length();
boolean[][] dp = new boolean[len][len];
for(int i = 0; i < len; i ++){
dp[i][i] = true;
}
//遍历
char[] chars = s.toCharArray();
for(int j = 1; j < len; j++){
for(int i = 0; i < j; i++){
//判断填充dp
if(chars[i] != chars[j]){
dp[i][j] = false;
}else if(j - i == 1){
dp[i][j] = true;
}else{
dp[i][j] = dp[i+1][j-1];
}
//更新maxLen和begin
if(dp[i][j] && j-i+1 > maxLen){
maxLen = j-i+1;
bengin = i;
}
}
}
return s.substring(bengin,bengin + maxLen);
}
}