1. 回文子串数
这道题我是用dp,创建一个dp二维数组,用来存放dp[i][j]这个字串是不是回文串。
也可以表达:如果最后一个字符和第一个字符相等,而且中间的子串是一个回文串,那么i-j就是回文子串
dp[ i ] [ j ] = dp[ i+1] [j-1] && ( s.charAt( i ) == s.charAt( j ) )
要注意的是,中间的这个子串也许是空,也就是aa这个情况,aa也算回文子串。那么就要加一个判断。j - i <2并且首位相等,直接就确定是子串。
class Solution {
public int countSubstrings(String s) {
int res = 0;
boolean dp[][] = new boolean[s.length()][s.length()];
//j是后边界,i是前边界
for (int j = 0; j < s.length(); j++) {
for (int i = 0; i >= 0; i--) {
//如果两端相等,并且中间没有字符串 或者 中间的也是一个回文串
if (s.charAt(i) == s.charAt(j)
&& ((j - i < 2) || dp[i + 1][j - 1])) {
//标记这个为回文串
dp[i][j] = true;
res++;
}
}
}
return res;
}
}
2. 最长回文子串
随后又看见一道题,求最大回文子串。这不是和上一题一样?就是添加两个变量maxlen和maxstr来标记最大。
class Solution {
public String longestPalindrome(String s) {
int maxlen = 0;
String maxstr = "";
int n = s.length();
//判断到底i-j的子串是不是回文
boolean[][] dp = new boolean[n][n];
for(int j=0; j<n; j++){
for(int i=j; i>=0; i--){
//判断是回文
if(s.charAt(i) == s.charAt(j)
&& (j-i<2 || dp[i+1][j-1])){
dp[i][j] = true;
//长度最大
if(j-i>=maxlen){
maxstr = s.substring(i,j+1);
maxlen = j-i;
}
}
}
}
return maxstr;
}
}