问题描述:
- 给定一个字符串
s
,返回字符串中回文子字符串的个数。
核心思路:
- 标准动态规划题目,相当于双指针思想。
dp[i][j]
表示 s[i,...,j]
能否组成回文串。【如果 dp[i][j] = 1
说明 s[i,...,j]
是回文串,因而统计 dp
数组中 1
的个数即可】
dp
数组中的状态转移如下:
- 当
s[i] != s[j]
,则 dp[i][j]
为 0
。 - 当
s[i] == s[j]
,则需要判断索引 i
与 j
的距离:
- 当
j-i <= 1
,则 dp[i][j]
为 1
。 - 当
j-i > 1
,则 dp[i][j]
的值取决于 dp[i+1][j-1]
。【相当于字符串双指针同时向内移动,即 s[i,...,j]
是否为回文串现在取决于 s[i+1,...,j-1]
】
代码实现:
class Solution
{
public:
int countSubstrings(string s)
{
int cnt = 0;
int m = s.size();
vector<vector<int>> dp(m, vector<int>(m));
for(int i = m-1; i >= 0; --i) for(int j = i; j < m; ++j)
{
if(s[i] == s[j] and (j-i <= 1 or dp[i+1][j-1]))
dp[i][j] = 1, ++cnt;
}
return cnt;
}
};