一、题目描述:647. 回文子串(中等)
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
方法一、动态规划,是动态数组dp[i][j]记录i~j的字符串是否是回文串,动态方程式dp[i][j] = (s[i]==s[j] &&dp[i-1][j+1] ==1)
方法二、中心扩展法,就是遍历每个字符作为中心,或者两个字符作为中心分别向两边扩展统计所有回文子串
三、代码
方法一
class Solution {
public:
int countSubstrings(string s) {
vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
int count = 0;
for(int i = 0; i < s.size(); i++)
{
for(int j = i; j >= 0; j--)
{
if(i == j)
{
dp[i][j] = 1;
count++;
}
else if(i == j+1)
{
if(s[i] == s[j])
{
dp[i][j] = 1;
count++;
}
}
else
{
if(s[j] == s[i] && dp[i-1][j+1] == 1)
{
dp[i][j] = 1;
count++;
}
}
}
}
//print(dp);
return count;
}
void print(vector<vector<int>> & dp)
{
for(int i = 0; i < dp.size(); i++)
{
for(int j = 0;j < dp[i].size(); j ++)
{
cout << dp[i][j]<<",";
}
cout<<endl;
}
}
};