打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LeetCode 647. 回文子串(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

来源:https://www.icode9.com/content-4-678501.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
572,动态规划解分割回文串 III
LeetCode实战:最长回文子串
「算法总结」13 道题搞定 BAT 面试——字符串
【小Y学算法】⚡️每日LeetCode打卡⚡️——5.最长回文子串
动态规划DP问题分类和经典题型
LeetCode 76. 最小覆盖子串
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服