给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
示例 1:
输入:s = "abc" 输出:3 解释:三个回文子串: "a", "b", "c"
class Solution {
public:
int countSubstrings(string s)
{
int len = s.size();
vector<vector<int>> dp(len + 1 , vector<int>(len + 1,false));
int count = 0;
for(int i = len - 1 ; i >= 0 ; i--)
{
for(int j = i ; j < len ; j++)
{
if(s[i] == s[j])
{
//if(i <= j)//少考虑一种ij是相邻元素并且相同的情况
if(j - i <= 1)
{
count++;
dp[i][j] = true;
}
else if(dp[i+1][j-1])
{
count++;
dp[i][j] = true;
}
}
}
}
return count;
}
};
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = "bbbab" 输出:4 解释:一个可能的最长回文子序列为 "bbbb" 。
class Solution {
public:
int longestPalindromeSubseq(string s)
{
int len = s.size();
vector<vector<int>> dp(len + 1, vector<int>(len + 1,0));
for(int i = 0 ; i < len ; i++) dp[i][i] = 1;
for(int i = len -1 ; i >= 0 ; i --)
{
for(int j = i + 1 ; j < len ; j ++)
{
if(s[i] == s[j])
{
dp[i][j] = dp[i+1][j-1] + 2;
}
else
{
dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
}
}
}
return dp[0][len - 1];
}
};
为什么这样不会上溢出?