目录
1、回文子串("引子题")
1.1 算法原理
- 状态表示:
dp[i][j]:[i, j]区间内的子串,是否回文(i <= j)
- 状态转移方程:
s[i] == s[j]:
1. i == j --> true
2. i+1==j --> s(i) == s(j) ? true : false
3. s(i) == s(j) --> dp[i+1][j-1]
- 初始化:
无需初始化(状态转移方程的前两种情况已处理特殊的边界情况)
- 建表顺序:
从下往上(根据状态转移方程)
- 返回值:
dp表中有几个true
1.2 算法代码
class Solution {
public int countSubstrings(String ss) {
char[] s = ss.toCharArray();
int n = s.length;
boolean[][] dp = new boolean[n][n];
int ret = 0;
// 填表 --> 从下往上
for(int i = n - 1; i >= 0; i--) {
// j >= i
for(int j = i; j < n; j++) {
if(s[i] == s[j]) {
if(i == j) dp[i][j] = true;
else if(i + 1 == j) dp[i][j] = true;
else dp[i][j] = dp[i + 1][j - 1];
}
if(dp[i][j]) ret++;
}
}
return ret;
}
}
2、最长回文子串
2.1 算法原理
本题算法原理与题一完全一致,最终返回最长的回文子串即可。
- 状态表示:
dp[i][j]:[i, j]区间内的子串,是否回文(i <= j)
- 状态转移方程:
s[i] == s[j]:
1. i == j --> true
2. i+1==j --> s(i) == s(j) ? true : false
3. s(i) == s(j) --> dp[i+1][j-1]
- 初始化:
无需初始化(状态转移方程的前两种情况已处理特殊的边界情况)
- 建表顺序:
从下往上(根据状态转移方程)
- 返回值:
最长回文子串
2.2 算法代码
class Solution {
public String longestPalindrome(String ss) {
char[] s = ss.toCharArray();
int n = s.length;
boolean[][]