B3810 [语言月赛 202307] 扶苏和串

[语言月赛 202307] 扶苏和串

题目背景

众所周知,每个月入门赛的字符串题都是扶苏来枚举 idea 出出来的。

题目描述

给定一个 01 字符串 s s s,你可以任选 s s s 的一个非空子串,把这个子串在 s s s翻转一次。

问你能得到字典序最小的字符串是什么?

形式化的,你可以选择一个区间 [ l , r ] [l, r] [l,r] 满足 1 ≤ l ≤ r ≤ ∣ s ∣ 1 \leq l \leq r \leq |s| 1lrs,构造一个串 t t t 满足:

t i = { s i , i < l 或  i > r s r − ( i − l ) , l ≤ i ≤ r t_i = \begin{cases}s_i, &i < l \text{ 或 } i > r \\ s_{r - (i - l)}, & l \leq i \leq r\end{cases} ti={si,sr(il),i<l  i>rlir

这里字符串的下标从 1 1 1 开始。

最小化字符串 t t t 的字典序。

输入格式

输入只有一行一个字符串,表示 s s s

输出格式

输出一行一个字符串,表示得到的字典序最小的字符串。

样例 #1

样例输入 #1

101

样例输出 #1

011

样例 #2

样例输入 #2

0010100

样例输出 #2

0000101

提示

样例 1 解释

s = 10 ‾ 1 s = \texttt{\underline{10}1} s=101,翻转下划线标出的子串,得到 t = 011 t = \texttt{011} t=011

样例 2 解释

s = 00 10100 ‾ s = \texttt{00\underline{10100}} s=0010100,翻转下划线标出的子串,得到 0000101 \texttt{0000101} 0000101

数据规模与约定

下面用 ∣ s ∣ |s| s 表示输入字符串的长度。

  • 20 % 20\% 20% 的数据, ∣ s ∣ ≤ 2 |s| \leq 2 s2
  • 40 % 40\% 40% 的数据, ∣ s ∣ ≤ 8 |s| \leq 8 s8
  • 另有 10 % 10\% 10% 的数据, s s s 只含字符 1 \texttt 1 1
  • 另有 10 % 10\% 10% 的数据, s s s 只含字符 0 \texttt 0 0
  • 100 % 100\% 100% 的数据, 1 ≤ ∣ s ∣ ≤ 100 1 \leq |s| \leq 100 1s100 s s s 只含字符 0,1 \texttt{0,1} 0,1

解析

题目描述:
给定一个01字符串s,你可以任选s的一个非空子串,把这个子串在s中翻转一次。问你能得到字典序最小的字符串是什么?

解题思路:
要得到字典序最小的字符串,我们可以枚举所有可能的子串,对每个子串进行翻转操作,并与当前的最小字典序字符串进行比较,更新最小字典序字符串。具体步骤如下:

  1. 初始化最小字典序字符串mins为原始字符串s。
  2. 使用两重循环枚举所有可能的子串:
    • 外层循环枚举子串的起始位置i,从0到字符串长度减1。
    • 内层循环枚举子串的结束位置r,从i到字符串长度减1。
  3. 对于每个枚举的子串[i, r],执行以下操作:
    • 将字符串s复制到一个临时字符串t中。
    • 使用reverse函数将t的子串[i, r]翻转。
    • 将翻转后的字符串t与当前的最小字典序字符串mins进行比较:
      • 如果t的字典序小于mins,则更新mins为t。
  4. 返回最终得到的最小字典序字符串mins。

C++代码实现:

#include <iostream>
#include <algorithm>
#include <string>
typedef long long ll;
using namespace std;string minstr(string s) {ll len = s.size();string mins = s;for (ll i = 0; i < len; ++i) {for (ll r = i; r < len; ++r) {string t = s;reverse(t.begin() + i, t.begin() + r + 1);if (t < mins) {mins = t;}}}return mins;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);string s;cin >> s;cout << minstr(s) << endl;return 0;
}

代码解释:

  1. 使用typedef long long ll定义了长整型别名ll。
  2. 函数minstr接受一个字符串s作为参数,返回字典序最小的字符串。
  3. 变量len表示字符串s的长度。
  4. 初始化最小字典序字符串mins为原始字符串s。
  5. 使用两重循环枚举所有可能的子串:
    • 外层循环变量i表示子串的起始位置,从0到len-1。
    • 内层循环变量r表示子串的结束位置,从i到len-1。
  6. 对于每个枚举的子串[i, r],执行以下操作:
    • 将字符串s复制到临时字符串t中。
    • 使用reverse函数将t的子串[i, r]翻转。
    • 将翻转后的字符串t与当前的最小字典序字符串mins进行比较:
      • 如果t的字典序小于mins,则更新mins为t。
  7. 返回最终得到的最小字典序字符串mins。
  8. main函数中,关闭输入输出的同步,以提高输入输出效率。
  9. 读入字符串s,调用minstr函数得到字典序最小的字符串,并输出结果。

时间复杂度分析:

  • 两重循环的时间复杂度为O(n^2),其中n为字符串的长度。
  • 字符串的复制和比较操作的时间复杂度为O(n)。
  • 因此,总的时间复杂度为O(n^3)。

空间复杂度分析:

  • 我们使用了额外的字符串t来存储翻转后的字符串,空间复杂度为O(n)。

这个解法通过枚举所有可能的子串并进行翻转操作,得到字典序最小的字符串。时间复杂度较高,为O(n^3),但实现起来比较直观易懂。如果你有任何其他问题或需要进一步的解释,请随时告诉我。

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

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

相关文章

R语言:使用 stringr 包进行字符串处理和正则表达式匹配

在 R 编程中&#xff0c;字符串处理和正则表达式匹配是常见的需求&#xff0c;而 stringr 包提供了强大的工具来简化这些操作。本文将介绍 stringr 包的基础用法&#xff0c;并结合正则表达式的相关内容&#xff0c;帮助你高效处理字符串数据。 字符串基础 创建字符串 在 R …

大模型训练数据白皮书深度解读

摘要 随着人工智能技术的飞速发展&#xff0c;大模型在各个领域的应用日益广泛。《大模型训练数据白皮书》为我们提供了对大模型训练数据重要性的深刻理解&#xff0c;本文将深度解读白皮书的主要内容&#xff0c;探讨大模型训练数据的关键要素、面临的挑战与未来发展趋势。 …

金融量化分析开源工具:TuShare

TuShare&#xff1a;一站式金融数据解决方案&#xff0c;让量化分析触手可及- 精选真开源&#xff0c;释放新价值。 概览 TuShare&#xff0c;是Github社区上一个专为金融量化分析师和数据爱好者设计的开源工具&#xff0c;提供了从数据采集、清洗加工到数据存储的全流程服务。…

缓存更新策略中级总结

背景 看到好些人在写更新缓存数据代码时&#xff0c;先删除缓存&#xff0c;然后再更新数据库&#xff0c;而后续的操作会把数据再装载的缓存中。然而&#xff0c;这个是逻辑是错误的。试想&#xff0c;两个并发操作&#xff0c;一个是更新操作&#xff0c;另一个是查询操作…

构建大语言模型友好型网站

以大语言模型为代表的AI 技术迅速发展&#xff0c;将会影响原有信息网络的方式。其中一个明显的趋势是通过chatGPT 对话代替搜索引擎和浏览器来获取信息。 互联网时代&#xff0c;主要是通过网站&#xff08;website&#xff09;提供信息。网站主要为人类阅读的方式构建的。主要…

高通Android开关机动画踩坑简单记录

1、下面报错有可能是selinux的原因 Read-only file system 2、接着push 动画 reboot之后抓取logcat出现 以下报错。看着大概意思像是压缩格式有问题。 3、于是重新压缩一下报错没有再出现 &#xff0c;压缩格式默认是标准&#xff0c;这里必须要改成存储格式哈 4、修改之后重新…

GitHub工程git merge出现冲突处理方式

GitHub工程git merge出现冲突处理方式 1. 源由2. 冲突解决2.1 触发合并冲突2.2 查看冲突状态2.3 打开冲突文件2.4 解决冲突2.5 标记冲突已解决2.6 继续合并2.7 检查合并结果 3. 示例 1. 源由 在产品研发中&#xff0c;常见的技术动作就是merge&#xff0c;而这个操作通常有两种…

Mysql基础 - 事务

Mysql基础 - 事务 文章目录 Mysql基础 - 事务1 事务简介2 事务操作2.1 控制事务一2.2 控制事务二 3 事务四大特性4 并发事务问题5 事务隔离级别 1 事务简介 事务是一组操作的集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有操作作为一个整体一起向系统提…

tcp协议的面向字节流介绍,粘包问题(解决的本质)

目录 面向字节流 引入 介绍 比喻 处理数据 粘包问题 引入 介绍 解决的本质 面向字节流 引入 对于udp来说,它是面向数据报的 一旦要发送数据,因为没有发送缓冲区,且不需要维护连接,直接封装完报头就发出去了依靠报头中的udp长度字段,可以拆分出报文然后交付给上层一个…

解决Vue项目Network: unavailable的问题

在vscode使用 npm run serve 运行 Vue项目时发现一个问题&#xff0c;项目只能通过Local访问而不能通过Network访问&#xff0c;终端显示如下&#xff1a; 碰到这种情况的解决方法&#xff1a;在环境变量的path中添加“C:\Windows\System32\Wbem” 1.找到“环境变量”&#xf…

Apollo9.0 PNC源码学习之Control模块(二)

前面文章&#xff1a;Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; 本文将对具体控制器以及原理做一个剖析 1 PID控制器 1.1 PID理论基础 如下图所示&#xff0c;PID各参数(Kp,Ki,Kd)的作用&#xff1a; 任何闭环控制系统的首要任务是要稳、准、快的响…

【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置. 1.基本概念 MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis. 2013年11月迁移到Github.持久层…

.net core webapi跨域

var builder WebApplication.CreateBuilder(args);// Add services to the container. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();//此处1 …

13 RTP包的使用

RTP RTP包最主要的就是Sequence number。 对于发送者来说&#xff0c;视频的每一个帧都有很多包组成。对于接收端来接收的时候是有一个队列进行接收的。这个队列大小都是通过计算的。有了队列之后就会不断的往队列中插入数据。当队列中有的数据超时一直组不成包的时候&#xf…

STM32 UART串口与RTOS的结合使用

STM32 UART串口与RTOS的结合使用 摘要&#xff1a; 实时操作系统&#xff08;RTOS&#xff09;为嵌入式系统提供了多任务处理和实时性能。STM32微控制器结合RTOS&#xff0c;可以有效地管理串口通信任务&#xff0c;提高系统的响应速度和稳定性。本文将探讨STM32 UART串口与RT…

MacOS升级ruby版本

MacOS自带ruby版本是2.x&#xff0c;可以通过“ruby -v”查看版本号 $ ruby -v ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin22]homebrew安装的ruby版本号可以通过“brew info ruby”命令参看 $ brew info ruby > ruby: stable 3.3.2 (bottled)…

深度学习的可微渲染

深度学习的可微渲染 可微渲染&#xff08;Differentiable Rendering&#xff09;是深度学习领域的一个重要概念&#xff0c;它将传统的计算机图形学与深度学习结合起来&#xff0c;通过使渲染过程可微分&#xff08;differentiable&#xff09;&#xff0c;以便于在深度学习模…

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模…

如何使用Pandas处理数据?

一、技术难点 Pandas是Python中一个强大的数据处理和分析库&#xff0c;它提供了高效、灵活且易于使用的数据结构&#xff0c;主要用于数据清洗、转换、聚合和可视化等任务。然而&#xff0c;在使用Pandas处理数据时&#xff0c;也会遇到一些技术难点。 数据导入与导出&#…

Python装饰器:打造强大的日志记录系统

题目:Python装饰器:打造强大的日志记录系统 摘要: 在Python编程中,装饰器是一种强大的工具,它允许我们以一种非常灵活的方式增强函数的功能。本文将详细介绍如何使用装饰器来实现日志记录,这是一种在开发过程中追踪函数调用和执行情况的有效手段。我们将从装饰器的基本…