当前位置:   article > 正文

leetcode_647_回文子串_给定一个字符串,输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字

给定一个字符串,输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

示例 1:

输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".

示例 2:

输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".

注意:

  1. 输入的字符串长度不会超过1000。

  1. class Solution {
  2. public:
  3. int countSubstrings(string s) {
  4. int len=s.size();
  5. int sum(len);
  6. for(int i=1;i<len-1;i++)//以i为中心拓展
  7. {
  8. int num=1;
  9. while(s[i-num]==s[i+num]&&i-num>=0&&i+num<len)
  10. {sum++;num++;}
  11. }
  12. for(int i=0;i<len-1;i++)//以i,i+1为中心拓展
  13. {
  14. int num=0;
  15. while(s[i-num]==s[i+1+num]&&i-num>=0&&i+num<len)
  16. {sum++;num++;}
  17. }
  18. return sum;
  19. }
  20. };
方法一是分两种情况来看,分别是奇数对称和偶数对称。
  1. class Solution {
  2. public:
  3. int countSubstrings(string s) {
  4. int n = s.length();
  5. int dp[n][n];
  6. int res = 0;
  7. for(int i=n-1;i>=0;i--){
  8. for(int j=i;j<n;j++){
  9. dp[i][j] = (s[i]==s[j])&&((j-i<3)||dp[i+1][j-1]);
  10. if(dp[i][j]!=0) res+=dp[i][j];
  11. }
  12. }
  13. return res;
  14. }
  15. };
这种方法是动态规划,
这里two pointers解法是优于dp的, 因为dp需要O(n^2) space, two pointers只要O(1) space, 而时间复杂度都是O(n^2)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/470789
推荐阅读
相关标签
  

闽ICP备14008679号