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;
}
}