回文串
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
我一直疑惑boolean的默认值是flase,为什么最后的if会这么写,
if( dp[i][j] && j-i+1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
总感觉是if dp[i][j]=false才进入,后来搞清楚,只有true才能进if,false进else。
代码中有详细注释
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
//长度为1的字符串,本身是回文
if(len < 2){
return s;
}
//设定最长回文字符串长度为1
int maxLen = 1;
int begin = 0;
//申明一个dp,表示bp[i][j]是一个s[i~j]是否是回文串
//boolean的默认值是false
boolean[][] dp = new boolean[len][len];
//初始化一个dp,对角线都为true,也就是长度为1的都为true
for(int i = 0; i < len; i++){
dp[i][i] = true;
}
//将字符串对象s中的字符转换为一个字符数组
char[] charArray = s.toCharArray();
//递推,枚举子串长度L
//因为L=1一定是回文,所以从2开始,可以到s的最后
for(int L = 2; L <= len;L++){
//填格子
for(int i = 0; i < len; i++){
//可以计算出右边的边界j
int j = i + L - 1;
//j也就是右边的边界,如果超过了长度,就是越界
if(j >= len){
break;
}
if(charArray[i]!=charArray[j]){
//如果最外边的两个字符不相等,说明不是回文
dp[i][j] = false;
}
else{
//如果最外边的两个字符相等,再判断是不是长度小于3,小于3直接是回文
if(j - i < 3){
dp[i][j] = true;
//大于3,就要去掉最外边的两个字符串,继续判断里边的最外边的字符是不是一样
}else{
dp[i][j] = dp[i+1][j-1];
}
}
//递归之后只要dp[i][L] == true成立,就表示子串s[i...L]是回文,此时记录回文长度和起始位置
//if里只跟true情况,else跟false,不需要考虑boolean的默认值是false
if( dp[i][j] && j-i+1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}
}