当前位置: 首页 > news >正文

湖大CG满分教程:作业训练四编程题20. 回文串(暴力×动态规划算法√)

问题描述

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。给你一个字符串,问最少在字符串尾添加多少字符,可以使得字符串变为回文串。

输入格式

有多组测试数据。

每组测试数据第一行是一个正整数N,表示字符串长度,接下来一行是长度为N的字符串,字符串中只有小写字母。

N=0表示输入结束,并且不需要处理。

40%的数列元素个数N 1 ≤ N≤ 100;

30%的数列元素个数N 1 ≤ N≤ 1000;

20%的数列元素个数N 1 ≤ N≤ 10000;

10%的数列元素个数N 1 ≤ N≤ 100000;

输出格式

  对于每组测试数据,输出一个非负整数:添加最少的字符数,可以使得字符串变为回文串。

样例输入

3
aba
4
aaac
0

样例输出

0
3

【算法思想】

  1. 动态规划数组初始化:创建了一个二维数组 dp,大小为 n x n,其中 dp[i][j] 表示子串 s[i..j] 是否是回文串的长度。

  2. 对角线初始化:将对角线上的元素 dp[i][i] 初始化为 1,表示单个字符本身就是回文串。

  3. 动态规划计算:使用两个嵌套的循环,从字符串末尾开始,遍历所有子串。在这个过程中,你检查字符是否相等,然后根据不同情况更新 dp[i][j] 的值。具体来说:

    • 如果 s[i] == s[j],有以下两种情况:
      • j - i <= 1 时,表示当前子串的长度为 2 或者 1,因此直接将 dp[i][j] 设置为 j - i + 1
      • j - i > 1 时,你检查 dp[i + 1][j - 1] 是否表示的子串是回文串,如果是,则更新 dp[i][j]dp[i + 1][j - 1] + 2,表示当前子串的长度为内部回文子串的长度加上 2。
  4. 状态转移方程的核心思想是:通过计算已知较短子串的回文信息,来推导出更长子串的回文信息。的状态转移方程基于如下考虑:

    s[i] == s[j] 时,如果 j - i <= 1,则当前子串长度为 2 或 1,因此是回文串,直接将 dp[i][j] 设置为 j - i + 1。当 s[i] == s[j]j - i > 1 时,首先检查 dp[i + 1][j - 1] 是否表示的子串是回文串。如果是,说明当前子串也是回文串,因此更新 dp[i][j]dp[i + 1][j - 1] + 2,表示当前子串的长度为内部回文子串的长度加上 2。
if (s[i] == s[j]) {if (j - i <= 1) {dp[i][j] = j - i + 1;} else if (dp[i + 1][j - 1]) {dp[i][j] = dp[i + 1][j - 1] + 2;}
}

这个方程的含义是,如果当前子串的两端字符相等,那么要判断该子串是否为回文串,首先考虑 j - i <= 1 的情况,如果成立,说明子串长度为 2 或 1,是回文串,直接标记长度;否则,考虑 dp[i + 1][j - 1] 是否为回文串,如果是,那么当前子串也是回文串,长度为内部回文子串的长度加上 2。

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;int main()
{int n;while(cin >> n && n != 0)  // 循环读取测试数据,直到 n 为 0 结束{string s;cin >> s;  // 读取输入的字符串string x = s;  // 创建一个与输入字符串相同的副本 xreverse(x.begin(), x.end());  // 将副本 x 反转if (x == s)  // 如果副本 x 和原始字符串 s 相同,说明已经是回文串{cout << "0" << endl;  // 输出结果为 0,无需添加字符}else{vector<vector<int>> dp(n, vector<int>(n, 0));  // 创建一个二维数组 dp,用于动态规划for (int i = 0; i < n; i++){dp[i][i] = 1;  // 对角线上的元素置为 1,表示单个字符本身是回文串}int max = 0;  // 用于记录最大的回文子串长度for (int i = s.size() - 1; i >= 0; i--)  // 从字符串末尾开始向前遍历{for (int j = i; j < s.size(); j++)  // 在 i 到字符串末尾范围内遍历{if (s[i] == s[j])  // 如果字符相同{if (j - i <= 1){dp[i][j] = j - i + 1;  // 当 j - i <= 1 时,长度为 2 或者 1,直接标记回文串长度}else if (dp[i + 1][j - 1])  // 当 j - i > 1 时,查看内部子串是否是回文串{dp[i][j] = dp[i + 1][j - 1] + 2;  // 更新回文串长度}}}}// 遍历最后一行,找到最大的回文子串长度for (int i = n - 1; i >= 0; i--){if (dp[i][n - 1] > max){max = dp[i][n - 1];}}cout << n - max;  // 输出最少需要添加的字符数,即字符串长度减去最大回文子串长度}}return 0;
}

相关文章:

湖大CG满分教程:作业训练四编程题20. 回文串(暴力×动态规划算法√)

问题描述 “回文串”是一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等等就是回文串。给你一个字符串&#xff0c;问最少在字符串尾添加多少字符&#xff0c;可以使得字符串变为回文串。 输入格式 有多组测试数据。 每组测试数据第一行是一个正整数N…...

使用toad库进行机器学习评分卡全流程

1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …...

Python数据容器——列表(list)

数据容器入门 Python中的数据容器&#xff1a; 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素 每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a;是否支持重复元…...

Linux CEF(Chromium Embedded Framework)源码下载编译详细记录

Linux CEF&#xff08;Chromium Embedded Framework&#xff09;源码下载编译 背景 由于CEF默认的二进制分发包不支持音视频播放&#xff0c;需要自行编译源码&#xff0c;将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。 前置条件 下载的过程非…...

Adaptive AUTOSAR—— Communication Management 3.1

9 Communication Management 9.1 What is Communication Management? 通信管理是自适应平台架构中的一个功能集群。 作为一个功能集群,通信管理向应用程序提供了一个C++ API,实现了面向服务的通信。服务是一个由应用程序提供的功能单元,可以在运行时被另一个应用程序动态…...

VMnet0 桥接设置

VMnet0 一定要设置为你的硬件物理网卡&#xff0c;不能设置自动&#xff0c;不然后&#xff0c;网线一断&#xff0c;就再也连不上了。必须重启电脑才能连上&#xff0c;这个问题找了很久才找到。 下面有个hyper-V虚拟网卡&#xff0c;如果选自动的话&#xff0c;物理网卡一掉…...

Sublime Text 4 Build 4151 4152 发布及注册方法

Sublime Text 是一个商业代码编辑器。它原生支持许多编程语言和标记语言&#xff0c;用户可以通过插件来扩展它的功能&#xff0c;这些插件通常是由社区建立的&#xff0c;并以自由软件许可证的形式维护。为了方便插件&#xff0c;Sublime Text 有一个 Python API。 Sublime T…...

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…...

软件单元测试

单元测试目的和意义 对于非正式的软件&#xff08;其特点是功能比较少&#xff0c;后续也不有新特性加入&#xff0c;不用负责维护&#xff09;&#xff0c;我们可以使用debug单步执行&#xff0c;内存修改&#xff0c;检查对应的观测点是否符合要求来进行单元测试&#xff0c…...

Redis | 集群模式

Redis | 集群模式 随着互联网应用规模的不断扩大&#xff0c;单一节点的数据库性能已经无法满足大规模应用的需求。为了提高数据库的性能和可扩展性&#xff0c;分布式数据库成为了解决方案之一。Redis 作为一个高性能的内存数据库&#xff0c;自然也有了自己的分布式部署方式…...

8.3day04git+数据结构

文章目录 git版本控制学习高性能的单机管理主机的心跳服务算法题 git版本控制学习 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 安装g…...

04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit

文章目录 1. 实例功能概述2. 源码2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. 实例功能概述 QComboBox 是下拉列表框组件类&#xff0c;它提供一个下拉列表供用户选择&#xff0c;也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外&#xff0c;每个…...

Sqlserver_Oracle_Mysql_Postgresql不同关系型数据库之主从延迟的理解和实验

关系型数据库主从节点的延迟是否和隔离级别有关联&#xff0c;个人认为两者没有直接关系&#xff0c;主从延迟在关系型数据库中一般和这两个时间有关&#xff1a;事务日志从主节点传输到从节点的时间事务日志在从节点的应用时间 事务日志从主节点传输到从节点的时间&#xff0…...

Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算

笔者在近一两年接触了Clickhouse数据库&#xff0c;在项目中也进行了一些实践&#xff0c;但一直都没有一些技术文章的沉淀&#xff0c;近期打算做个系列&#xff0c;通过一些具体的场景将Clickhouse的用法进行沉淀和分享&#xff0c;供大家参考。 首先我们假设一个Clickhouse数…...

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力&#xff1a;下一波生产力浪潮》中指出&#xff0c;生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中&#xff0c;「生成式AI」…...

如何使用 ChatGPT 规划家居装修

你正在计划家庭装修项目&#xff0c;但不确定从哪里开始&#xff1f;ChatGPT 随时为你提供帮助。从集思广益的设计理念到估算成本&#xff0c;ChatGPT 可以简化你的家居装修规划流程。在本文中&#xff0c;我们将讨论如何使用 ChatGPT 有效地规划家居装修&#xff0c;以便你的项…...

题解 | #1002.Random Nim Game# 2023杭电暑期多校7

1002.Random Nim Game 诈骗博弈题 题目大意 Nim是一种双人数学策略游戏&#xff0c;玩家轮流从不同的堆中移除棋子。在每一轮游戏中&#xff0c;玩家必须至少取出一个棋子&#xff0c;并且可以取出任意数量的棋子&#xff0c;条件是这些棋子都来自同一个棋子堆。走最后一步棋…...

篇九:组合模式:树形结构的力量

篇九&#xff1a;“组合模式&#xff1a;树形结构的力量” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff0c…...

【注册表】windows系统注册表常用修改方案

文章目录 ◆ 修改IE浏览器打印页面参数设置◆气泡屏幕保护◆彩带屏幕保护程序◆过滤IP(适用于WIN2000)◆禁止显示IE的地址栏◆禁止更改&#xff29;&#xff25;默认的检查(winnt适用)◆允许DHCP(winnt适用)◆局域网自动断开的时间(winnt适用)◆禁止使用“重置WEB设置”◆禁止更…...

ant-design-vue 4.x升级问题-样式丢失问题

[vue] ant-design-vue 4.x升级问题-样式丢失问题 项目环境问题场景解决方案 该文档是在升级ant-design-vue到4.x版本的时候遇到的问题 项目环境 "vue": "^3.3.4", "ant-design-vue": "^4.0.0", "vite": "^4.4.4&quo…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...