1 题目描述
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:“abc” 输出:3 解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:“aaa” 输出:6 解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
提示:
2 解题(Java)
2.1 动态规划法
class Solution {
public int countSubstrings(String s) {
int n = s.length();
int res = 0;
boolean[][] dp = new boolean[n][n];
for (int j=0; j<s.length(); j++) {
for (int i=0; i<=j; i++) {
if (s.charAt(i) == s.charAt(j) && (j-i < 3 || dp[i+1][j-1])) {
dp[i][j] = true;
res++;
}
}
}
return res;
}
}
复杂性分析
时间复杂度为 O(N2),空间复杂度为 O(N2)。
2.2 中心扩展法
两种情况:
- 以1个点作为中心点向两端扩展;
- 以2个点作为中心点向两端扩展;
class Solution {
public int countSubstrings(String s) {
int res = 0;
for (int i = 0; i <= s.length() * 2 - 2; i++) {
int left = i / 2;
int right = (i + 1) / 2;
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
res++;
left--;
right++;
}
}
return res;
}
}
复杂性分析
时间复杂度为 O(N2),空间复杂度为 O(1)。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindromic-substrings
|