题解 | #字符串的展开#

字符串的展开

https://ac.nowcoder.com/acm/problem/16644

既然是模拟,那就要对所有特殊情况进行处理,所有特殊情况如下:

  1. 开头和结尾的‘-’,如“-a-d-”
  2. 连续的‘-’,如“---”
  3. 数字和字母之间的‘-’,如“1-a”
  4. ‘-’左侧的字符大于右侧的,如“d-a”

上面的特殊情况,如果有一个满足,那就将‘-’看作普通的字符,将其原样复制到ans字符串中即可。

若都不满足的话,那就将其看作特殊字符串,调用solution函数进行处理。

下面是代码

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int p1, p2, p3;
string str, ans;

string solution(char l, char r) {
	string s;
	int k = p2;
	for (char i = l + 1; i < r; ++i) {	
		for (int j = 0; j < k; ++j) {
			if (p1 == 1) {
				s+=tolower(i);
			}
			if (p1 == 2) {
				s += toupper(i);
			}
			else if (p1 == 3) {
				s += '*';
			}
		}
	}
	
	if (p3 == 1) return s;
	else {
		string t;
		for (int i = s.size() - 1; i >= 0; --i) {
			t += s[i];
		}
		return t;
	}
}
int main() {
	cin >> p1 >> p2 >> p3;
	cin >> str;
	for (int i = 0; i < str.size(); ++i) {
		//遍历到‘-’后,开始检测所有的特殊情况
		if (str[i] == '-' && i - 1 >= 0 && i + 1 < str.size() && str[i - 1] != '-' && str[i + 1] != '-' && str[i + 1] > str[i - 1] && abs(str[i + 1] - str[i - 1]) <= 26)
			ans += solution(str[i - 1], str[i + 1]);
		else ans += str[i];
	}
	cout << ans << endl;
	return 0;
}
全部评论
补充一个特殊情况,--a,开头两个减号,这个卡了我半天
点赞 回复 分享
发布于 2024-01-31 00:15 广东
想问下你是怎么看出“1-a”,是一种特殊情况,把‘-’直接复制即可? 我当时认为,类似“8-c” 变成 “89abc”。 这题目好像还有个前置题目,不知道你有没有链接?
点赞 回复 分享
发布于 2024-01-17 18:16 广东

相关推荐

太难了,双9bg也被刷
投递韶音科技等公司10个岗位
点赞 评论 收藏
分享
07-15 00:33
江苏大学 Java
代码飞升:哈哈哈哈评论区三个打广告的
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
10
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务