C++实现LeetCode(647.回文子字符串)

这篇文章主要介绍了C++实现LeetCode(647.回文子字符串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

C++实现LeetCode(647.回文子字符串),恰卡网带你了解更多相关信息。

[LeetCode] 647. Palindromic Substrings 回文子字符串

Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1:

Input: \”abc\”
Output: 3
Explanation: Three palindromic strings: \”a\”, \”b\”, \”c\”.

Example 2:

Input: \”aaa\”
Output: 6
Explanation: Six palindromic strings: \”a\”, \”a\”, \”a\”, \”aa\”, \”aa\”, \”aaa\”.

Note:

  1. The input string length won\’t exceed 1000.

这道题给了一个字符串,让我们计算有多少个回文子字符串。博主看到这个题,下意识的想着应该是用 DP 来做,哼哼哧哧写了半天,修修补补,终于通过了,但是博主写的 DP 不是最简便的方法,略显复杂,这里就不贴了。还是直接讲解大神们的解法好了。其实这道题也可以用递归来做,而且思路非常的简单粗暴。就是以字符串中的每一个字符都当作回文串中间的位置,然后向两边扩散,每当成功匹配两个左右两个字符,结果 res 自增1,然后再比较下一对。注意回文字符串有奇数和偶数两种形式,如果是奇数长度,那么i位置就是中间那个字符的位置,所以左右两遍都从i开始遍历;如果是偶数长度的,那么i是最中间两个字符的左边那个,右边那个就是 i+1,这样就能 cover 所有的情况啦,而且都是不同的回文子字符串,参见代码如下:

解法一:

class Solution {public:    int countSubstrings(string s) {        if (s.empty()) return 0;        int n = s.size(), res = 0;        for (int i = 0; i < n; ++i) {            helper(s, i, i, res);            helper(s, i, i + 1, res);        }        return res;    }    void helper(string s, int i, int j, int& res) {        while (i >= 0 && j < s.size() && s[i] == s[j]) {            --i; ++j; ++res;        }    }};

在刚开始的时候博主提到了自己写的 DP 的方法比较复杂,为什么呢,因为博主的 dp[i][j] 定义的是范围 [i, j] 之间的子字符串的个数,这样其实还需要一个二维数组来记录子字符串 [i, j] 是否是回文串,那还不如直接就将 dp[i][j] 定义成子字符串 [i, j] 是否是回文串就行了,然后i从 n-1 往0遍历,j从i往 n-1 遍历,然后看 s[i] 和 s[j] 是否相等,这时候需要留意一下,有了 s[i] 和 s[j] 相等这个条件后,i和j的位置关系很重要,如果i和j相等了,则 dp[i][j] 肯定是 true;如果i和j是相邻的,那么 dp[i][j] 也是 true;如果i和j中间只有一个字符,那么 dp[i][j] 还是 true;如果中间有多余一个字符存在,则需要看 dp[i+1][j-1] 是否为 true,若为 true,那么 dp[i][j] 就是 true。赋值 dp[i][j] 后,如果其为 true,结果 res 自增1,参见代码如下:

解法二:

class Solution {public:    int countSubstrings(string s) {        int n = s.size(), res = 0;        vector<vector<bool>> dp(n, vector<bool>(n));        for (int i = n - 1; i >= 0; --i) {            for (int j = i; j < n; ++j) {                dp[i][j] = (s[i] == s[j]) && (j - i <= 2 || dp[i + 1][j - 1]);                if (dp[i][j]) ++res;            }        }        return res;    }};

到此这篇关于C++实现LeetCode(647.回文子字符串)的文章就介绍到这了,更多相关C++实现回文子字符串内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/2109.html

(0)
上一篇 2021-07-10 01:45:20
下一篇 2021-07-10 01:45:22

相关推荐

  • 大肚子的生肖是什么生肖(大肚子代表什么生肖)

    大肚子的生肖是什么生肖,大肚子代表什么生肖 内容导航: 明代有本书,明确阐述了十二生肖动物的搭配原理,你知道吗 肚子特别大是什么生肖 世界上肚子最大是谁猜一只生肖急 一、明代有本书…

    2022-09-05
    8260
  • 月入2万的10个小生意(早餐店)

    月入2万的10个小生意,早餐店内容导航:月入2万的10个小生意有哪些月入2万的10个小生意月入2万的10个小生意都有哪些月入2万的10个小生意,有没有大神可以分享出来一、月入2万的10个小生意有哪些想要创业,建议

    2022-04-18
    1040
  • 新上热文小说(林潇荷周淮肆)讲的是什么-小说林潇荷周淮肆已完结全集大结局

    林潇荷马上明白过来,昨天她在医院睡过去以后,周淮肆把她带过来,并给她卸了妆换了衣服。顿时,林潇荷感觉自己要烧起来了。“嗡——”手机响声不停,林潇荷咬住红唇,获救一般抓过床头柜上的手机。电话接通,她大哥向来冰冷的嗓音响在她耳畔:“来中心医院,爷爷情况不乐观。”半小时后。京市中心医院五楼手术室外。林潇荷匆匆赶来。

    2023-05-20
    00
  • (岳佩珊穆振荣)短篇小说阅读-强推岳佩珊穆振荣女主的小说

    ​第二天,岳佩珊看着脖子上怎么也藏不住的草莓印,不由一阵苦恼,最后只好穿上一身长袖竖领的衣衫,幸亏是雪纺的,要不然在这样的天气就要热死。岳佩珊全副武装后,才踏进自己的办公室。想来今天沈宇郴应该不会来了。只不过岳佩珊没想到,刚走了一个又来了一个。穆振荣想到自己昨天的一举一动,连他自己都不知道向来引以为傲的自制力竟然在岳佩珊身上崩溃的这么彻底。这个女人,这个女人果然是个祸水!“来人。”

    2023-05-10
    00
  • 摆地摊赚钱吗(看看网友们分享的经历)

    今日话题:摆地摊赚钱吗?看看网友们的回答!网友一:千万别瞧不起摆地摊,我和我妈在工厂门口摆地摊卖衣服,一个晚上有5/600的利润,就是有时候城管看见了不让摆,衣服在厂家直接拿的,卖完了再给钱,没什么成本,每天只摆晚上几个小时。网友二:我们

    2021-11-12 创业分享
    2390
  • 小说林秋蝶周翰景整理推荐-林秋蝶周翰景在线阅读的小说完整版

    林秋蝶在洗手池吐了半天也没吐出来,反倒是想上厕所了。等她拉开隔间时,有人从后面挤了进来。林秋蝶能感觉到,是个男人。而且…是个危险的男人。他身上散发的气息明显是要做那事的前兆。“三爷?”林秋蝶惊呼。

    2023-04-29
    00

发表回复

登录后才能评论