一、Description
给定一个字符串,计算所有的回文子串。起始下标不同的算不同的子串。
举例1:
Input: "abc" Output: 3 Explanation: Three palindromic strings: "a", "b", "c".
举例2:
Input: "aaa" Output: 6 Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".
二、Analyzation
对于这类问题,应该考虑采用动态规划,创建一个dp[][]数组,对于dp[i][j] = 1表示该字符串中下标从i到j的位置的子串为回文字符子串,从子串长度=1、=2和>=3分别对dp数组进行初始化和求解,只要满足条件计数器加一,最终返回结果。
如果仅仅计算回文子串有多少(不同起始下标但子串相同算一个),可增加一个map进行判断即可。
三、Accepted code
class Solution {
public int countSubstrings(String s) {
int result = 0;
if (s == null || s.length() == 0) {
return result;
}
int length = s.length();
int[][] dp = new int [length][length];
for (int i = 0; i < length; i++) {
dp[i][i] = 1;
result++;
}
for (int i = 0; i < length - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
dp[i][i + 1] = 1;
result++;
}
}
for (int len = 2; len < length; len++) {
for (int i = 0; i + len < length; i++) {
int j = i + len;
if (dp[i + 1][j - 1] == 1 && s.charAt(i) == s.charAt(j)) {
dp[i][j] = 1;
result++;
}
}
}
return result;
}
}