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

回文子串的个数_统计回文子串的个数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; 
}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • android之activity的生命周期详解

    刚在看mars老师的视频,看到activity的生命周期,感觉挺有收获,就总结了一下.为了更清楚的看清楚工作的具体过程,举例如下:,建立两个activity,一个main,一个another,在main里面放置button加监听器跳转向another,在每个复写的activity的状态方法里都加一个log输出,比如onCrea

  • nodejs和java多线程_nodeJS和Java哪个难?「建议收藏」

    nodejs和java多线程_nodeJS和Java哪个难?「建议收藏」刚好最近学了一点Java,来回答下这个问题。首先这个问题不好说谁难谁易(就像是问篮球足球谁难),深入学习之后会发现都很难。nodeJS底层是依赖v8跟libuv(c\c++),部分模块是用c++编写,所以深入了解之后会发现还得学c++。而Java将代码编译成字节码运行在虚拟机上,相应的Java字节码、JVM都要去了解。所以研究底层的话两者都很难,不太好区分谁更难。不过从题主的问题来看可能想问的是n…

  • 反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux

    反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux

  • 大数据挖掘有哪些技术

    大数据挖掘有哪些技术  数据挖掘技术虽是一项新兴的数据处理技术,但其发展速度十分迅猛,至今已经形成了决策树、神经网络、统计学习、聚类分析、关联规则等多项数据挖掘技术,极大的满足了用户的需求。  1、决策树算法  决策树算法是分类和预测的常用技术之一,可用于深入分析分类问题,使用时,决策树能够利用预测理论对多个变量中进行分析,从而预测处任一变量的发展趋势和变化关系;除此以外,还能对变量发展趋势进行双向预测,既能进行正向预测,也能进行反向预测,因此具有方便灵活的优势。  2、神经网络算法  神经网络是将计算机技术与

  • Android adb 命令大全「建议收藏」

    Android adb 命令大全「建议收藏」转自:https://github.com/mzlogin/awesome-adbADB,即AndroidDebugBridge,它是Android开发/测试人员不可替代的强大工具,也是Android设备玩家的好玩具。持续更新中,欢迎提PR和Issue补充指正,觉得有用的可以将此GitHub仓库Star收藏备用。注:有部分命令的支持情况可能与Android…

  • mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例[通俗易懂]

    mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例[通俗易懂]【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例时间:2016-11-0513:54来源:Oracle研究中心作者:HTZ点击:次天萃荷净Oracle研究中心学习笔记:分享一篇关于Oracle数据库关于SQL解析的详细文档,该文档详细介绍使用10049event事件来分析SQL语句的解析笔记。1,数据库版本SQL>select*fromv$ve…

发表回复

您的电子邮箱地址不会被公开。

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