给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先计算长度为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
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
来源:https://www.icode9.com/content-4-678501.html联系客服