LeetCode647:回文子串
题目链接:647. 回文子串 - 力扣(LeetCode)
代码如下:
class Solution {
public:
int countSubstrings(string s) {
vector<vector<bool>> dp(s.size() + 1, vector<bool>(s.size() + 1, false));
int result = 0;
for(int i = s.size() - 1; i >= 0; i--)
{
for(int j = i; j < s.size(); j++)
{
if(s[i] == s[j])
{
if(j - i <= 1)
{
dp[i][j] = true;
result++;
}
else if(dp[i + 1][j - 1] == true)
{
dp[i][j] = true;
result++;
}
}
}
}
return result;
}
};
dp的含义:[i, j]这个区间是否是回文子串
dp的递推公式:
if(s[i] == s[j])
{
if(j - i <= 1)
{
dp[i][j] = true;
result++;
}
else if(dp[i + 1][j - 1] == true)
{
dp[i][j] = true;
result++;
}
}
这个就是先判断s[i] == s[j]如果相等的话,看看是不是j-i<=1,其实你好好想想,既然s[i] == s[j],分成两个情况,第一个是j-i<=1这个情况了。如果相等的话,那就算一个,如果不是的话,那就看看是不是[i + 1, j - 1]这个区间里面是否回文字符串,如果是的话,那么就让result++,为什么呢?因为你既然都s[i] == s[j]了,而且[i + 1, j - 1]这个区间还是会问,那么[i , j]肯定也是会问的。
初始化:这个需要画一个2*2,来看这个需要怎样初始化,通过画一个2*2表格,来看dp[i - 1][j - 1]能通过哪个方向推导出来,然后分析,只需要都初始化为false即可。
遍历顺序:这个也是先画一个2*2的表格,然后发现,这个只能由下到上,由左到右,那么这个由下到上,这个时候就需要从后往前遍历了,如果从前往后遍历,那么你最后一个值你求不出来。
返回值:返回值的话就是我们在题目中所给的result,返回这个值即可。