AcWing 4890:哞操作 ← 字符串

ops/2024/10/10 23:55:24/

【题目来源】
https://www.acwing.com/problem/content/4893/

【题目描述】
给定一个字符串,其中的每个字符要么是 M,要么是 O。
你可以通过以下操作将该字符串变为 MOO:

改变字符串中的第一个或最后一个字符(M 变为 O,O 变为 M)。
删除字符串中的第一个或最后一个字符。

请你计算,为了将给定字符串变成 MOO,所需要的最少操作次数。

【输入格式】
第一行包含整数 Q,表示共有 Q 组测试数据。
每组数据占一行,包含一个字符串,其中的每个字符要么是 M,要么是 O。

【输出格式】
每组数据输出一行结果,一个整数,表示所需要的最少操作次数。
如果无解,则输出 -1

【数据范围】
1≤Q≤100,
每个字符串的长度范围 [1,100]。

【输入样例】
3
MOMMOM
MMO
MOO

【输出样例】
4
-1
0

【样例解释】
第一个字符串 MOMMOM 变为 MOO 最少需要 4 步操作,一种可行方案为:
将最后一个字符变为 O。
删除第一个字符。
删除第一个字符。
删除第一个字符。
第二个字符串无法变为 MOO。
第三个字符串已经是 MOO,无需任何操作。

【算法分析】
★ s.
substr(pos,len):返回字符串 s 中从 pos 开始的 len 个字符的子串

#include <bits/stdc++.h>
using namespace std;int main() {string s;cin>>s;for(int i=0; i<s.size()-2; i++) {string t=s.substr(i,3);cout<<t<<endl;}return 0;
}/*
in:
abcdefgout:
abc
bcd
cde
def
efg
*/

★ 样例分析
首先字符串至少要有 3 位,没有直接输出 -1。
我们三位三位模拟取最小值,只要中间是 O,都可以变成 MOO。也就是说,由M和O组成的三位字符串虽然有“
OOOOOM、OMO、OMM、MOOMOM、MMO、MMM”等8种组合,但通过题目给出的两种操作,能变为MOO的初始字符串只能是含有“MOO、MOM、OOO、OOM”等四种子串的字符串
操作次数如下:

MOO:0 次。
MOM:1 次。
OOO:1 次。
OOM:2 次。
最终取最小值加上总长度 -3 即可。因为最终只能保留 3 位。如果 t 仍是初始值,那么输出 -1。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int inf=0x3f3f3f3f;int main() {int T;cin>>T;while(T--) {string s;cin>>s;if(s.size()<3) {cout<<"-1"<<endl;continue;}int t=inf;for(int i=0; i<s.size()-2; i++) {string sub=s.substr(i,3);if(sub=="MOO") t=min(t,0);else if(sub=="MOM") t=min(t,1);else if(sub=="OOO") t=min(t,1);else if(sub=="OOM") t=min(t,2);}if(t==inf) cout<<"-1"<<endl;else cout<<t+s.size()-3<<endl;}return 0;
}/*
in:
3
MOMMOM
MMO
MOOout:
4
-1
0
*/





【参考文献】
https://www.acwing.com/solution/content/172013/


http://www.ppmy.cn/ops/123713.html

相关文章

PHP基本语法总结

目录 输出语句 注释 数据类型&#xff08;变量&#xff09; 局部和全局作用域 类型比较&#xff08;松散比较与严格比较&#xff09; 常量 运算符 并置运算符 不等于 逻辑运算符 条件语句 数组 关联数组 数组排序 一般数组 关联数组 循环 函数 变量函数 魔…

MVVM 架构模式:解耦、可测试与高效

在现代的前端开发中&#xff0c;MVVM&#xff08;Model-View-ViewModel&#xff09;已成为非常流行的设计模式&#xff0c;尤其是在单页面应用&#xff08;SPA&#xff09;开发中。它通过解耦视图和业务逻辑&#xff0c;提升了代码的可维护性和扩展性。今天我们来深入探讨MVVM …

Golang 进阶3—— 协程管道

Golang 进阶3—— 协程&管道 注意&#xff0c;该文档只适合有编程基础的同学&#xff0c;这里的go教程只给出有区别的知识点 注意 程序 & 进程 & 协程 的区别 1. 协程 又称为微线程&#xff0c; 纤程&#xff0c; 协程是一种用户态的轻量级线程 作用&#xff…

【C++篇】虚境探微:多态的流动诗篇,解锁动态的艺术密码

文章目录 C 多态详解&#xff08;进阶篇&#xff09;前言第一章&#xff1a;多态的原理1.1 虚函数表的概念1.1.1 虚函数表的生成过程 1.2 虚表的存储位置 第二章&#xff1a;动态绑定与静态绑定2.1 静态绑定2.1.1 静态绑定的实现机制&#xff1a;2.1.2 示例代码&#xff1a; 2.…

手动降级wsl中的numpy

下载完pytorch之后想验证一下cuda好不好使&#xff0c;在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低&#xff0c;numpy太高&#xff0c;所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…

Spring Cloud Netflix Ribbon 负载均衡详解和案例示范

1. 引言 在传统的集中式架构中&#xff0c;负载均衡器一般是放置在服务器端的&#xff0c;例如 Nginx等。随着微服务架构的兴起&#xff0c;服务实例的数量和部署地点变得更加动态和分布式&#xff0c;这使得在客户端进行负载均衡成为了一种可行且更灵活的方案。Netflix Ribbo…

kubeadm部署k8s1.28.0主从集群(cri-dockerd)

1. kubernetes集群规划 主机IP主机名主机配置角色192.168.100.3master12C/4G管理节点192.168.100.4node12C/4G工作节点192.168.100.5node22C/4G工作节点 2. 集群前期环境准备 &#xff08;1&#xff09;初始化脚本 #!/bin/bash echo "——>>> 关闭防火墙与SE…

专栏简介:Java 17 深入剖析:从入门到精通

Java 17 深入剖析&#xff1a;从入门到精通 专栏简介 在信息技术迅猛发展的今天&#xff0c;Java 语言凭借其跨平台的特性、强大的生态系统以及丰富的社区支持&#xff0c;依然稳居开发者的首选。随着 Java 17 的发布&#xff0c;Java 语言引入了众多创新特性和改进&#xff…