[动态规划] 回文子串

回文子串

题目描述

给定一个字符串,输出所有回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串
比如: abba   cccdeedccc都是回文字符串
我们要查找的子串长度应该大于等于2

关于输入

输入是一行,即可一个字符串。长度500以内
比如:
abcddcbaab

关于输出

输出所有的回文子串,一个满足条件的子串一行。
子串长度小的优先输出,出现在原始字符串靠左的子串优先输出。
比如对于abcddcbaab
输出:
dd
aa
cddc
baab
bcddcb
abcddcba

例子输入
123321125775165561
例子输出
33
11
77
55
2332
2112
5775
6556
123321
165561
解题分析

首先,我们可以定义一个二维数组dp,它的大小是501x501,所有元素都初始化为0。在这个数组中,dp[i][j]表示从位置i到位置j的子串是否是回文。

接下来我们可以设置两层循环:

这个循环是程序的核心部分。外层的循环变量l表示子串的长度,从2开始,一直到字符串的长度len。内层的循环变量i表示子串的开始位置,从0开始,一直到len-l,末尾位置j我们设为i+l-1(例如i=0,l=2表示从0位置开始的长度为2的子串,即str[0]和str[1],1=0+2-1)。

在内层的循环中,我们首先计算子串的结束位置j(即i+l-1)。然后,我们检查子串的开始和结束位置的字符是否相同,并且子串去掉两端之后的部分(即从i+1到j-1的部分)是否是回文。如果这两个条件都满足,那么我们就知道从i到j的子串是回文,于是我们将dp[i][j]设为1,并打印出这个子串。

在打印子串的代码中,我们使用了一个循环来打印出子串的所有字符,然后打印一个换行符,表示这个子串的结束。

代码实现
#include <stdio.h>
#include <string.h>int main() {char str[501];scanf("%s", str);int len = strlen(str);int dp[501][501] = {0};for (int l = 2; l <= len; l++) {for (int i = 0; i + l - 1 < len; i++) {int j = i + l - 1;if (str[i] == str[j] && (l == 2 || dp[i + 1][j - 1])) {dp[i][j] = 1;for (int k = i; k <= j; k++) {printf("%c", str[k]);}printf("\n");}}}return 0;
}

(方法2)

当然,如果我们使用c++的string类型,本题将会变得非常简单,不再需要动态规划也能较为迅速的做出。

#include <iostream>
using namespace std;bool iscyclic(string s){for(int i=0,j=s.size()-1;i<=j;i++,j--){if(s[i]!=s[j]) return 0;}return 1;
}int main() {string s; cin>>s;for(int i=2;i<=s.size();i++){for(int k=0;k<=s.size()-i;k++){string temp=s.substr(k,i);if(iscyclic(temp)){cout<<temp<<endl;}}}return 0;
}

这个程序的目标也是找出一个字符串中的所有回文子串。这个程序使用了一个不同的方法,即直接生成所有可能的子串,然后检查每个子串是否是回文。

以下是程序的详细思路:

1. **定义回文检查函数**:首先,程序定义了一个名为`iscyclic`的函数,用于检查一个字符串是否是回文。这个函数通过比较字符串的两端的字符来工作:如果两端的字符都相同,那么它就继续检查下一对字符,否则它就返回0,表示这个字符串不是回文。如果所有的字符对都相同,那么函数就返回1,表示这个字符串是回文。

2. **输入字符串**:在`main`函数中,程序首先读取一个字符串,存储在变量`s`中。

3. **生成子串**:接下来,程序开始生成所有可能的子串。外层循环的变量`i`表示子串的长度,从2开始,一直到字符串的长度。内层循环的变量`k`表示子串的开始位置,从0开始,一直到`s.size()-i`。这样可以保证子串的结束位置不超过字符串的长度。

   - 在内层的循环中,程序使用`substr`函数生成一个子串,然后使用`iscyclic`函数检查这个子串是否是回文。

4. **输出回文子串**:如果找到一个回文子串,程序就直接打印出这个子串。

关于`substr`函数,它是C++的`string`类的一个成员函数,用于生成一个字符串的子串。`substr`函数接受两个参数:第一个参数是子串的开始位置,第二个参数是子串的长度。例如,`s.substr(k, i)`生成了从位置`k`开始,长度为`i`的子串。

这就是这个程序的全部思路。这个程序的关键是直接生成所有可能的子串,然后检查每个子串是否是回文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vr红色教育虚拟展馆全景制作提升单位品牌形象

720全景展馆编辑平台以其独特的优势&#xff0c;为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案&#xff0c;进一步提升了展览行业的水平和影响力。 一、提升展示效果&#xff0c;增强品牌形象 720全景展馆编辑平台通过…

使用conan包 - 工作流程

使用conan包 - 工作流程 主目录 conan Using packages1 Single configuration2 Multi configuration 本文是基于对conan官方文档Workflows的翻译而来&#xff0c; 更详细的信息可以去查阅conan官方文档。 This section shows how to setup your project and manage dependenci…

32 - MySQL调优之事务:高并发场景下的数据库事务调优

数据库事务是数据库系统执行过程中的一个逻辑处理单元&#xff0c;保证一个数据库操作要么成功&#xff0c;要么失败。谈到他&#xff0c;就不得不提 ACID 属性了。数据库事务具有以下四个基本属性&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Con…

Windows全系列 本地密码暴力破解

首先 咱们要准备两个工具&#xff1a; 第一个是 pwdump-master 第二个是 saminside_softradar-com.exe这两个工具 我会一并上传 需要的同学 可以自取本文章操作思路是&#xff1a; 第一步 首先把我刚刚提到的两个软件 以某种手段放置于机器中 如果是真实机 就用U盘 拷贝到真实机…

基于Java SSM框架+Vue实现药品保健品购物网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现药品保健品购物网站演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 ssm药源购物网站&#xff0c;主要的模块包括两个用户&#xff0c;管理员权限&#xff1a;用…

OJ练习第186题——统计子串中的唯一字符

统计子串中的唯一字符 力扣链接&#xff1a;828. 统计子串中的唯一字符 题目描述 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s “LEETCODE” &#xff0c;则其中 “L”, “T”,“C”,“O”…

【Github】git安装

我们经常需要对github上的项目进行复现或者使用&#xff0c;git指令可以方便我们更好地实现他们。 Part 0. 准备 配置代理IP 面对问题&#xff1a;关于登陆github网站网速慢、下载git项目网速慢。 解决&#xff1a;无论是windows还是linux系统&#xff0c;都可以找到/etc/ho…

RK3568平台开发系列讲解(Linux系统篇)pinctrl api介绍及实验

&#x1f680;返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍pinctrl api及其使用案例 。 一、pinctrl函数介绍 ①获取设备对应的 pinctrl…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现)FPGA部分

一、 实验目的 1、掌握基于 Verilog 语言的 diamond 工具设计全流程。 2、熟悉、应用 Verilog HDL 描述数字电路。 3、掌握 Verilog HDL 的组合和时序逻辑电路的设计方法。 4、掌握“小脚丫”开发板的使用方法。 二、 实验原理 与门逻辑表达式:Y=AB 原理仿真图: 2 输入…

智慧工厂人员定位系统源码,融合位置物联网、GIS可视化等技术,实现对人员、物资精确定位管理

智慧工厂人员定位系统源码&#xff0c;UWB高精度定位系统源码 随着中国经济发展进入新常态&#xff0c;在资源和环境约束不断强化的背景下&#xff0c;创新驱动传统制造向智能制造转型升级&#xff0c;越发成为企业生存发展的关键。智能工厂作为实现智能制造的重要载体&#xf…

OpenGL之Mesa3D编译for Ubuntu20.04(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Elasticsearch启动失败问题汇总

版本elasticsearch-8.11.1&#xff0c;解压安装完后&#xff0c;修改安装目录下conf/jvm.options&#xff0c; 默认配置如下&#xff1a; -Xms4g -Xmx4g 默认的配置占用内存太多了&#xff0c;调小一些&#xff1a; -Xms256m -Xmx256m由于es和jdk是一个强依赖的关系&#xff0…

jQuery_05 事件的绑定(尝试)

jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 jQuery如何绑定事件呢&#xff1f; 1. $("选择器").事件名称(事件处理函数) $("选择器") &#xff1a; 选择0或者多个dom对象 给他们添加事件 事件名称&#xff1a;就是js中事件名称去掉on的部…

springboot集成Redis连接工具类

1&#xff0c;配置pom文件&#xff0c;引入相应资源文件 2&#xff0c;配置application.properties&#xff0c;如果springboot版本差别太大&#xff0c;配置中的属性名会有不同&#xff0c;请注意修改。 #redis配置 # Redis数据库索引&#xff08;默认为0&#xff09; spri…

【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

【JAVA】SpringBoot mongodb 分页、排序、动态多条件查询及事务处理 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mongodb ↓ -->&…

力扣刷题篇之递归

系列文章目录 目录 系列文章目录 前言 一、二叉树相关问题 二、回溯相关问题 三、动态规划相关问题 总结 前言 刷题按照&#xff1a;[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09;&#xff0c;如图&#xff0c;因为是讲…

C 中的指针 - 结构和指向指针的指针

0. 结构体指针 与整数指针、数组指针和函数指针一样&#xff0c;我们也有结构体指针或结构体指针。 struct records {char name[20];int roll;int marks[5];char gender; };struct records student {"Alex", 43, {76, 98, 68, 87, 93}, M};struct records *ptrStud…

A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 如何去掉

在host串口里一直出现打印 A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 这个是有一个进程一直在执行中&#xff0c;那么是什么呢&#xff1f;因为我的host通过SSH连接后就可以进入host shell界面了。那这个线程是什么程序导致的呢&#xff1f; …

Linux socket编程(7):I/O系统调用(读/写/连接)的超时处理

在网络编程中&#xff0c;对套接字的I/O的系统调用(如read,write,connect)进行超时处理是至关重要的&#xff0c;特别是在需要响应及时的实时数据或避免无限期阻塞的情境下。本文将深入介绍处理套接字I/O超时的两种方法&#xff1a;setsockopt和select。setsockopt允许直接设置…

小程序域名SSL证书的重要性

1. 数据安全 小程序中可能涉及用户的个人信息、支付信息等敏感数据&#xff0c;而未加密的通信容易受到中间人攻击。通过使用SSL证书&#xff0c;所有数据在传输过程中都会被加密&#xff0c;确保用户信息不被窃取或篡改。 2. 用户信任 浏览器和操作系统对使用SSL证书的网站…