回文子串的个数_统计回文子串的个数

回文子串的个数_统计回文子串的个数1、题目描述本题要求统计一个字符串中包含多少个回文子串。首先我们来确定子串的概念:一个字符串的子串,就是指它本身的各个部分。如字符串“aba”的子串有“a”、“b”

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1、题目描述

 

  1.1、题目

        本题要求统计一个字符串中包含多少个回文子串。首先我们来确定子串的概念:一个字符串的子串,就是指它本身的各个部分。如字符串“aba”的子串有“a”、“b”、“a”、“ab”、“ba”和“aba”。

       再来看回文,回文就是从左读到右和从右读到左都是一样的,长度为1的字符串也是回文。如“a”、“s”、”aa”、“aba”和“aabaa”等都是回文。

      本题在一个字符串中,单个字符也被认为是回文子串,相同的重复的子串也需要计算在内。本题要求判断一个字符串中的所有的子串是否是回文子串。如果用常规方法做,肯定会出现超时错误。这里采用由中心向外扩散的方法去判断一个子串是否是回文子串,如果最中心的子串不是回文,那么,立即终止,不必去判断向外围扩散的子串了,这就大大节约了时间。

      下面以“abaa”为例,讲解由中心向外扩散的方法,如下图所示。

回文子串的个数_统计回文子串的个数

(1)从左往右,钉住最后一个字符。

“abaa”串:先考查中心子串“ba”不是回文串,就可以判定“abaa”不是回文子串;

“baa”串:先考查中心子串“baa”不是回文,它是最外子串,不必向外扩散;

“aa”串:考查中心子串中“aa”是回文,它是最外子串,不必向外扩散。

(2)从右边倒数第二个字符往左,钉住第一个字符。

“aba”串:考查中心子串“aba”,是回文,它是最外子串,不必向外扩展;

“ab”串:考查子串“ab”,不是回文,它是最外子串,不必向外扩展;

这样下来,加上单个子串“a”,“b”,“a”,“a”4个,“abaa”中共包含6个回文子串。

  1.2、输入描述

输入数据中有多个测试案例。每个案例是一个非空且长度不超过5000的字符串。

处理到文件结尾。

   1.3、输出描述

在每行上打印该字符串中回文子串的个数。

  1.4、输入样例

aba

aa

  1.5、输出样例

4

3

2、C++实现

#include <iostream> 
using namespace std; 
int main(int argc, char* argv[]) { 
    char s[5000]; 
    int p, i, Half, Left, Right, Count; 
    while( cin>>s ) { 
        i = strlen(s); Count = 0; //从左到右钉住最后一个 
        for(p=0; p<=i-1; p++) { 
            Half = ((i-1)-p) / 2; //如果子串是奇数个 
            if( ((i-1)-p)%2 == 0 ) { 
                Left = p + Half - 1; 
                Right = p + Half + 1; 
            } 
            else { //如果子串是偶数个
                Left = p + Half; 
                Right = p + Half + 1; 
            } 
            while(Left >= p) { 
                if( s[Left] == s[Right]) { 
                    Count++; //发现了一个回文串 
                    Left--; 
                    Right++; 
                } else { //如果不相等,立即终止,由中心向外扩散不可能会有回文串 
                     break; 
                } 
            } 
        } //从右到左钉住第一个 
        for(p=i-2; p>=1; p--) { 
            Half = p / 2; //如果子串是奇数个 
            if(p%2 == 0) { 
                Left = Half - 1; 
                Right = Half + 1; 
            } else //如果子串是偶数个 { 
                Left = Half; 
                Right = Half + 1; 
            } 
            while( Left >= 0 ) { 
                if( s[Left] == s[Right] ) { 
                    Count++; //发现了一个回文串 
                    Left--; 
                    Right++; 
                } else { //如果不相等,立即终止,由中心向外扩散不可能会有回文串 
                    break; 
                } 
            } 
        } 
        printf("%d\n",Count + i); 
    } 
    return 0; 
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181307.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql事务隔离级别可重复读_innodb默认隔离级别

    mysql事务隔离级别可重复读_innodb默认隔离级别一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为>:串行化>RR>RC>读未提交在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?这个是有历史.

    2025年9月16日
    7
  • ETH被冻结_微信冻结显示什么界面

    ETH被冻结_微信冻结显示什么界面如果我们的电脑在启动挖矿软件的时候,发现界面有停顿,Miner都会冻结。有时矿工会随机冻结,直到按下任何键。而我们要做下如下设置则可以解决这个问题。1、cmd命名行界面;2、右击窗口,点属性大力矿工致力于挖矿软件研究,欢迎大家加入群:621159725,一起讨论ETH挖矿。…

    2022年10月15日
    2
  • **解决mysql 1045拒绝登陆的问题**

    **解决mysql 1045拒绝登陆的问题**解决mysql1045拒绝登陆的问题当你登录MySQL数据库出现:Error1045错误时(如下图),就表明你输入的用户名或密码错误被拒绝访问了,最简单的解决方法就是将MySQL数据库卸载然后重装,但这样的缺点就是就以前的数据库中的信息将丢失,如果你不想重装,那么就需要找回密码或者重置密码。解决的方法应该有多种,这里我推荐大家使用一种原理通过,操作简单的方法,适用于windows以及linux平

    2022年5月2日
    43
  • Nuke Python脚本读取文件渲染所需要的分辨率

    Nuke Python脚本读取文件渲染所需要的分辨率

    2021年9月8日
    78
  • mybatis插件原理_mybatis分页查询实现

    mybatis插件原理_mybatis分页查询实现目录一、mybatis插件介绍二、mybatis插件原理1、创建2、拦截1)首先是ParameterHandler的创建,在Configuration类当中:2)interceptorChain保存了所有的拦截器(interceptors),是mybatis初始化的时候创建的。3、应用1)类相关代码2)插件配置,在sqlMapConfig.xml中三、自定义插件1、插件接口2、自定义插件1)相关类代码2)相关配置sqlMapConfig.xml3)mapper接口4)mapper.

    2022年10月7日
    2
  • PAT乙级经验分享(19.03.02)「建议收藏」

    PAT乙级经验分享(19.03.02)「建议收藏」一、关于报名条件:有身份证就行!!报名费用:256人民币(?为什么涨价)报考方式:https://www.patest.cn考场:自选就近考点参与考试。二、关于要准备的东西准考证!!身份证!!考试会发草稿纸!如果有喜欢写写画画的同学们可以带笔啦(走进考场,看看大家纷纷拔出笔的瞬间,我:…)必胜的决心(?)三、关于考试(PAT乙级)考试时间为180分钟;乙级共有5道…

    2022年4月29日
    243

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号