文章目录
1. 题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:
输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
示例 2:
输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:
输入的字符串长度不会超过1000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindromic-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 动态规划
- 先计算长度为1,2的子串,然后按长度动态规划
class Solution {
public:
int countSubstrings(string s) {
if(s.size() <= 1)
return s.size();
int i, j, len, n = s.size(), count = s.size();
vector<vector<bool>> dp(n,vector<bool>(n,0));
for(i = 0; i < n; ++i)
{
dp[i][i] = true;
if(i < n-1 && s[i]==s[i+1])
{
dp[i][i+1] = true;
count++;
}
}
for(len = 1; len < n; ++len)
{
for(i = 0; i < n-len; ++i)
{
if(dp[i][i+len-1] && i-1>=0 && s[i-1]==s[i+len])//是回文串
{
dp[i-1][i+len] = true;
count++;
}
}
}
return count;
}
};
124 ms 7.8 MB
2.2 中心扩展法
class Solution {
public:
int countSubstrings(string s) {
if(s.size() <= 1)
return s.size();
int i, count = 0;
for(i = 0; i < s.size(); ++i)
{
centerspand(s,i,i,count);
centerspand(s,i,i+1,count);
}
return count;
}
void centerspand(string& s, int l, int r, int& count)
{
while(l>=0 && r<s.size() && s[l]==s[r])
{
count++;
l--;r++;
}
}
};
4 ms 6.3 MB