Description
Given a string s
, return the number of palindromic substrings in it.
A string is a palindrome when it reads the same backward as forward.
A substring is a contiguous sequence of characters within the string.
Example 1:
Input: s = “abc” Output: 3 Explanation: Three palindromic strings: “a”, “b”, “c”.
Example 2:
Input: s = “aaa” Output: 6 Explanation: Six palindromic strings: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
Constraints:
1 <= s.length <= 1000
s
consists of lowercase English letters.
Code
Expands
Simply expand in Odd length and Even Length.
class Solution {
public:
int countSubstrings(string s) {
int res = 1, n = s.length();
int count = 0;
for(int i = 0; i < n; i++) {
count += expand(s, i, i);
count += expand(s, i, i + 1);
}
return count;
}
int expand(string& s, int l, int r) {
int count = 0;
while(l >= 0 && r < s.length() && s[l] == s[r]) {
count++;
l--;
r++;
}
return count;
}
};
DP
Time Complexity: , Space Complexity:
我們知道長度為 1 必定是 palindrome,長度為 2 若相同則也是 palindrome,長度 3 以上,就要看頭尾是否相等,以及去掉頭尾之後是否是 palindrome。
class Solution {
public:
int countSubstrings(string s) {
int n = s.length();
vector<vector<bool>> dp(n, vector<bool>(n, false));
int ans = 0;
for(int len = 1; len <= n; len++) {
for(int i = 0; i < n - len + 1; i++) {
if(s[i] == s[i + len - 1] && (len <= 2 || dp[i + 1][i + len - 2])) {
dp[i][i + len - 1] = true;
ans++;
}
}
}
return ans;
}
};
/*
dp[i][j] : s[i ... j] is a palindrome
dp[i][j] = true if s[i] == s[j] && dp[i + 1][j - 1] = true;
*/