首页 > 其他分享 >第十八节 小组学习

第十八节 小组学习

时间:2023-07-29 09:56:05浏览次数:48  
标签:26 第十八 int 字母 小组 学习 ++ flag str

AT_agc022_a 题解

洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给定字符串 \(S\) , 仅包含互不相同的小写字母, 你需要找到仅包含互不相同的小写字母的字符串中,第一个字典序比它大的字符串, 如果找不到输出 \(-1\)。(\(| S | \le 26\))

思路

这篇题解主要分享一下 map 的做法。

可分两种情况讨论:

  1. 字符串长度 \(< 26\)。

  2. 字符串长度 \(= 26\)。

因为互不相同所以不会出现大于 \(26\) 的情况。

对于样例 \(4\):abcdefghijklmnopqrstuvwzyx

可将 w 变为它后面比它大但最小x,后面直接舍去即可,变为 abcdefghijklmnopqrstuvx

解释完样例,先来讨论一下情况 \(1\),因为长度小于 \(26\),所以至少有 \(1\) 个字母未出现过,直接在字符串末尾加上没出现过最小字母即可。

对于情况 \(2\),就可参考以上样例 \(4\) 的解释,可发现找到一个位置,把这个位置上的字母替换为它后面比它大但最小的字母即可,这个位置需要从后向前枚举

那么接下来就是实现了,首先需要定义一个 map 容器,来存储哪些字母出现过或没出现过,对于情况 \(1\) 直接模拟即可。

对于情况 \(2\) 则需记录一个最大值,如果当前位置小于最大值再枚举,这样就避免了不合法的情况了。

经过以上分类讨论,很容易即可写出代码了:

#include<iostream>
#include<map>
using namespace std;

string str;
int maxn;
map<char, int> mp;
map<int, bool> vis;

int max(int x, int y) { return (x > y) ? x : y; }

int main() {
	cin >> str;
	int n = str.length(); // 记录长度
	for(int i = 0; i < n; i ++) mp[str[i]] ++; // 计数
	if(n < 26) {
		for(int i = 'a'; i <= 'z'; i ++) 
			if(!mp[i]) {
				cout << str << char(i) << endl; // 没有出现过,直接输出结束
				return 0;
			}
	}
  	// 从后向前枚举
	for(int i = n - 1; i >= 0; i --) {
  		// 满足条件,可输出
		if(str[i] < maxn) {
			for(int j = 0; j < i; j ++) cout << str[j];
			for(int j = str[i] - 'a'; j < 26; j ++) 
				if(vis[j]) {
					cout << char(j + 'a'); // 输出替换的字母
					return 0;
				}
		}
		maxn = max(maxn, str[i]);
		vis[str[i] - 'a'] = true;
	}
	cout << "-1\n"; // 以上条件都不满足,输出 -1
	return 0;
}

提交记录

\[\text{The End!} \]

CF858C 题解

洛谷链接&CF 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给你一个均为小写字母的字符串,如果它的子串同时满足:

  1. 三个连着的辅音字母。

  2. 这一段连着的辅音字母不是全部一样的。

就认为它不合法。

现在要求用最少的空格隔开这个字符串,使得它变成合法的。

思路

首先定义记录当前位置是否是元音字母的数组 \(a\),并维护它,如下:

for(int i = 0; i < n; i ++) {
		bool flag = false;
		for(int j = 0; j < 5; j ++) 
			if(str[i] == c[j]) flag = true;
		a[i] = flag;
	}

接着直接根据题目要求模拟即可,定义 \(num\) 记录当前连续辅音字母的个数,当这个个数 \(\ge 3\) 之后输出空格即可,这里需要注意:需要先输出空格再输出字母!

经过以上分析及代码片段,很容易即可写出代码了:

#include<iostream>
using namespace std;

char c[10] = {'a', 'e', 'i', 'o', 'u'}; // 元音字母数组
string str;
bool a[3005]; // 记录是否是元音字母

int main(){
	cin >> str;
	int n = str.length();
  	// 预处理 a 数组
	for(int i = 0; i < n; i ++) {
		bool flag = false;
		for(int j = 0; j < 5; j ++) 
			if(str[i] == c[j]) flag = true;
		a[i] = flag;
	}
	int num = !a[0]; // 初始化 num
	cout << str[0]; // 先输出第一个字母
	for(int i = 1; i < n; i ++) {
  		// 如果是辅音字母
		if(!a[i]) {
			num ++; // 增加计数
			if(num >= 3 && !(str[i - 2] == str[i] && str[i - 1] == str[i])) {
				cout << ' '; // 满足条件输出空格
				num = 1; // num 初始化
			}
		}
		else num = 0; // 元音字母
		cout << str[i]; // 正常输出
	}
	return 0;
}

提交记录

\[\text{The End!} \]

标签:26,第十八,int,字母,小组,学习,++,flag,str
From: https://www.cnblogs.com/So-noSlack/p/17589327.html

相关文章

  • ugui学习 - 自己实现InputField光标的显示,闪烁,左右移动
    最终效果 代码usingSystem.Collections;usingUnityEngine;usingUnityEngine.UI;[DisallowMultipleComponent][RequireComponent(typeof(CanvasRenderer))][RequireComponent(typeof(RectTransform))]publicclassMyInputField_Caret:MonoBehaviour,ICanvasEle......
  • 线程池学习
    具体文章见: Java线程池实现原理及其在美团业务中的实践线程池好处降低资源消耗提高响应速度提高线程的可管理性提供更多更强大的功能线程池解决的问题频繁申请、销毁资源和调度资源,将地阿莱额外的消耗,可能会非常巨大。对资源无限申请缺少抑制手段,易引发系统资源耗尽的......
  • SpringBoot学习---第五篇:动态数据源(多数据源自动切换)
    目录一、应用场景二、准备工作2.1 创建数据表2.2添加依赖2.3生成bean、dao、mapper三、动态数据源3.1 配置文件application.properties3.2动态数据源核心代码3.3 启动类添加注解四、使用方法4.1Controller4.2Service五、测试六、Springboot2.0动态多数据源切换一、应用......
  • 程序员进阶必备,这份Android架构师进阶学习资料全家桶助你提升无忧
    走技术这条路的程序员进阶需要具备什么条件呢?大概总结起来有两点:1.扎实的基础底层功底(四大组件、布局使用、多线程、动画…)2.技术的深度和广度(自定义View、性能优化、Flutter、热修复、插件化…)3.同时,了解和学习常用的开源库也十分重要,常用的开源库主要包括图片加载、网络请求、......
  • 基于LSTM深度学习网络的时间序列预测matlab仿真
    1.算法理论概述       时间序列预测是一类重要的预测问题,在很多领域都有着广泛的应用,如金融、交通、气象等。然而,由于时间序列数据本身具有时序性和相关性,因此预测难度较大。传统的时间序列预测方法大多采用统计学方法,如ARIMA模型、指数平滑法等,但这些方法在处理非线性、......
  • docker aspnetcore学习笔记
    在终端窗口cmd:  示例应用程序对于示例应用程序,让我们使用.NET从模板创建一个简单的应用程序。在本地计算机中创建一个名为的目录。打开终端并切换到该目录。运行以下命令,使用ASP.NET核心Web应用模板创建C#应用。$mkdirdotnet-docker$cddotnet-docker$dotne......
  • JavaScript学习 -- HMAC算法基本原理
    HMAC(Hash-basedMessageAuthenticationCode)算法是一种基于哈希算法的消息认证码算法。它可以用于验证和保护数据在传输过程中的完整性和真实性。在JavaScript中,我们可以使用HMAC算法来保证数据的安全性。本篇文章将介绍HMAC算法的基本原理和相关技术,并提供一些实例来演示如何在Ja......
  • RHCE7 认证之学习笔记
    -------------------------------------------------------------------------------------------初始化:两台服务器设置yum源-------------------------------------------------------------------------------------------[root@system1~]#vim/etc/yum.repos.d/yum.repo[root@......
  • 【算法】哈希学习笔记
    1.哈希(hash)简介1.1前言又来写算法总结了qwq。今天是2023/7/8,期末考试已经考完了。初二下注定是一个煎熬的学期,所以我在这一学期并没有学什么新算法,OI也没什么长进。但倒是深造了几个算法,比如:dp,hash,线段树。之前一直想写一篇hash的学习笔记,但由于种种原因,并没有写成。于......
  • 学习vue又一天
    学习vue又一天,终于把样式、表单、等全部看完了,真的是很简单,都不知道怎么形容,可能是有一定基础的学习比较快吧,然后看了axios,感觉与Ajax的差别不是太大,估计是没有太深入了解的原因,这块我先简单看了一下,然后等后面项目开始的时候再看混合式api看了几次,说实话没看太明白,计划先略过......