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

算法题(117):字符串的展开

审题:

本题需要我们根据题目的要求将字符串进行扩展

思路:
方法一:模拟法

一般来说题目字数和要求很多的题就是模拟题,模拟题特别需要注意的就是细节,在编写代码之前一定要把细节想清楚,否则很容易出错。

分析模拟过程:

首先,题目给了我们一个字符串,这个字符串中的某些部分是需要扩展的,有些部分是不用扩展的,在这里我们就分成这两大类

需要扩展:

(1)特殊扩展:对于'-'两边的字符属于顺序递增的情况,我们就直接越过'-'接入output

(2)普通扩展:

控制插入字符:通过if语句控制字母与数字字符的插入字符

控制插入数量:通过append方法控制p2个字符插入

控制插入顺序:通过reverse方法控制p3为2时的顺序

不需要扩展:直接接入output字符串

解题:

#include<iostream>
#include<algorithm>
using namespace std;
int p1, p2, p3;
string input;
string output;
bool issametype(char a, char b)
{
	return (islower(a) && islower(b)) || (isdigit(a) && isdigit(b));
}
int main()
{
	cin >> p1 >> p2 >> p3;
	cin >> input;
	//输出字符串构建
	for (size_t i = 0; i < input.size(); i++)
	{
		//扩展
		if (i > 0 && i < input.size() - 1 && input[i] == '-' && issametype(input[i-1],input[i+1]) && input[i+1] > input[i-1])
		{
			if (input[i - 1] + 1 == input[i + 1])
			{
				continue;
			}
			string s;
			//确定待插入临时串s
			for (char c = input[i - 1] + 1; c < input[i + 1]; c++)
			{
				char ch;
				//展开方式+重复个数
				
				
					if (p1 == 2)
					{
						if (islower(c))//小写字母单独处理
							ch = toupper(c);
						else//数字处理
							ch = c;
					}
					else if (p1 == 3)
					{
						ch = '*';
					}
					else
					{
						ch = c;
					}
					s.append(p2, ch);		
			}
			//插入顺序
			if (p3 == 2)
			{
				reverse(s.begin(),s.end());
			}
			//插入
			output += s;
		}
		else //不展开
		{
			output += input[i];
		}	
	}
	cout << output;
}

注意:

1.利用库方法isdigit判断是否为数字字符,islower判断是否为小写字母。

2.判断越界不要使用i-1,因为i是size_t类型,-1后会变成很大的正数,导致逻辑错乱。

3.对于输出类型部分:p1为1和3对于数字的字母都是一样的,而p1为2就需要分开处理

4.toupper将小写字母转大写,append将多个重复字符插入字符串

P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷

http://www.dtcms.com/a/112713.html

相关文章:

  • 16.2Linux自带的LED灯驱动实验(详细编写)_csdn
  • OJ系统C端UI自动化测试
  • Kubernetes 集群搭建(一):从环境准备到 Calico 网络插件部署
  • 自定义填充 cad
  • SpringCloudGateWay
  • spring security 过滤器链相关初始化过程
  • 使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
  • C/C++测试框架googletest使用示例
  • 用HTML.CSS.JavaScript实现一个贪吃蛇小游戏
  • 基于Go语言实现一个网络聊天室(连接Redis版)
  • Kubernetes集群管理详解:从入门到精通
  • Eliet Chat开发日志:信令服务器注册与通信过程
  • JAVA单例模式
  • 2023-2024总结记录
  • leetcode二叉树刷题调试不方便的解决办法
  • 【Redis】服务端高并发分布式结构
  • 使用Scrapy官方开发的爬虫部署、运行、管理工具:Scrapyd
  • 网安小白筑基篇五:web后端基础之PHP
  • Springboot----@Role注解的作用
  • C++设计模式-解释器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • 【Python使用】嘿马推荐系统全知识和项目开发教程第2篇:1.4 案例--基于协同过滤的电影推荐,1.5 推荐系统评估【附代码
  • 【Android】界面布局-线性布局LinearLayout-例子
  • 编程能力的跃迁时刻:技术革命与认知重构的交响曲
  • MySQL索引原理:从B+树手绘到EXPLAIN
  • 合肥京东运营服务商TOP5推荐
  • Axure数据可视化科技感大屏设计资料——赋能多领域,展示无限价值
  • C# 类库生成后自动复制到指定目录
  • Mysql 集群架构 vs 主从复制架构
  • PostgreSQL LIKE 操作符详解
  • 如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用