标签:子串 && ++ len dp 647 LeetCode DP 回文
文章目录
1. 题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 动态规划
- 先计算长度为1,2的子串,然后按长度动态规划
class Solution {
public:
int countSubstrings(string s) {
if(s.size() <= 1)
return s.size();
int i, j, len, n = s.size(), count = s.size();
vector<vector<bool>> dp(n,vector<bool>(n,0));
for(i = 0; i < n; ++i)
{
dp[i][i] = true;
if(i < n-1 && s[i]==s[i+1])
{
dp[i][i+1] = true;
count++;
}
}
for(len = 1; len < n; ++len)
{
for(i = 0; i < n-len; ++i)
{
if(dp[i][i+len-1] && i-1>=0 && s[i-1]==s[i+len])//是回文串
{
dp[i-1][i+len] = true;
count++;
}
}
}
return count;
}
};
124 ms 7.8 MB
2.2 中心扩展法
class Solution {
public:
int countSubstrings(string s) {
if(s.size() <= 1)
return s.size();
int i, count = 0;
for(i = 0; i < s.size(); ++i)
{
centerspand(s,i,i,count);
centerspand(s,i,i+1,count);
}
return count;
}
void centerspand(string& s, int l, int r, int& count)
{
while(l>=0 && r<s.size() && s[l]==s[r])
{
count++;
l--;r++;
}
}
};
4 ms 6.3 MB
标签:子串,&&,++,len,dp,647,LeetCode,DP,回文 来源: https://blog.csdn.net/qq_21201267/article/details/105576327
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。