欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析
🌎推荐文章:【LeetCode】winter vacation training
目录
👉🏻回文子串
原题链接:回文子串
mycode:
class Solution {
public:
bool isPalindrome(string& str)
{
string tmp = str;
reverse(str.begin(), str.end());
if (str == tmp) return true;
else return false;
}
int countSubstrings(string s) {
//dp[i]:第i位置共有多少个回文字符串
//dp[i] = dp[i-1] + 1 + [0,i-1]
int n = s.size();
vector<int> dp(n);
dp[0] = 1;
for (int i = 1; i < n; i++)
{
dp[i] = dp[i - 1] + 1;
for (int j = 0; j < i; j++)
{
string str(s.begin()+j,s.begin()+i+1);//左闭右开所以i要加1
if (isPalindrome(str)) dp[i]++;
}
}
return dp[n - 1];
}
};
进阶优化:
class Solution {
public:
int countSubstrings(string s) {
int n = s.size();
vector<vector<bool>> dp(n,vector<bool>(n));
int ret = 0;
for(int i = n-1;i>=0;i--)
{
for(int j = n-1;j>=i;j--)
{
if(s[i]==s[j]) dp[i][j] = i+1<j?dp[i+1][j-1]:true;//i+1<j就是i==j和i+1==j以外的所有情况
if(dp[i][j]==true) ret++;
}
}
return ret;
}
};