回文子串数
中心扩展法:
- 选定回文串的中心,用两个指针分别向两边移动,在移动的过程中检查 s.subString(i, j) 还是不是回文串,即 s[i] == s[j] 吗?是的话结果加一,不是的话停止移动换下一个中心
- 不过回文串的长度有奇数和偶数,所以中心要分别枚举一个和两个的情况
// 中心扩展法
public int countSubstrings(String s) {
int res = 0;
for (int i = 0; i < s.length(); i++) {
// 中心为一个字符的情形
int left = i, right = i;
while (left >= 0
&& right < s.length()
&& s.charAt(left) == s.charAt(right)) {
res++;
left--;
right++;
}
// 中心有两个字符的情形
if (s.length() - 1 != i && s.charAt(i) == s.charAt(i + 1)) {
left = i;
right = i + 1;
while (left >= 0 &&
right < s.length() &&
s.charAt(left) == s.charAt(right)) {
res++;
left--;
right++;
}
}
}
return res;
}
动态规划:
dp[i][j]
表示s.subString(i, j)
是不是回文串,dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j)
- 字符串的 dp 数组往往记录的并不是直接答案,答案需要在 dp 的过程中决定