剪切粘贴 天梯赛一阶题

首先表达一下第二次看到这个题目的想法——不想做第二次了。
不过,孔夫子说,”温故知新!“。这里就将第一次没有做出来的遗憾弥补一下吧。

预备知识

cstring 神奇的库

可能各位大犇早就知道这些了,那就直接点个赞跳过去吧。
知识清单

1. string类型支持字符串的直接拼接

string a = "123";
string b = "456";

那么 a+b = "123456",这一点看似普通,实则幻化无穷。相比原来的char数组的手动拼接不知道方便了多少。

2. insert函数

insert并不陌生吧,就是插入。
这里直接介绍最简单的用法。
a.insert(pos, s)
这句话的意思就是,在a字符串的pos位置,插入字符串s。
还是不理解的话看例子。

string a = "123789";
string s = "456";
a.insert(3, s);

结果应该不难想到123456789
整个过程就是在pos起点,往后添加字符串s

3. erase函数

erase翻译过来就是擦去,说人话,就是删除delete
这里同样介绍简单用法。
a.erase(start, len)
我想各位佬可能早就会了,这里我还是再解释一下。

删除从start位置开始的,长度为len的字符串。

不懂?
看例子

string a = "123456789";
a.erase(3, 3);

结果123789。都看到这里了,想必你也明白了。

4. find函数

这里也不过多解释,就是查找,下面给出最基本的用法。
a.find(b,start)

白话文:在a的start下标往后的字符串里面找b,返回起始索引。

还是粒子法。(你们都举栗子,我偏偏要粒子)

string a = "123456789";
string b = "234"int pos = a.find(b,0); // 这个返回下标索引
// 也可以使用下main的句子
size_t = a.find(b, 0);

结果就是1。这里哆嗦一句,如果找不到就会返回一个很特殊的值。
如果你是使用的int pos就会得到-1
如果你是使用的size_t pos就会得到a.npos,这里不了解的自己去查一查,哈哈哈。

5. substr函数

substr主要是来取出子字符串。
简单用法如下
a.substr(start, len)

从start开始往后取出长度为len的子字符串

还是例子。

string a = "123456789";
string b = a.substr(2, 3);

结果就是b的结果是"345"

正题

终于讲完了基本操作,这里走入正题。


--- ***我是分割线*** ---

首先,剪切操作

剪所选部分

这里我直接使用上面讲过的substr,一步到位

切走所选部分

这里也是同理,直接上erase删除,一步到位。

粘贴部分

找到位置

这里题目是给出两个字符串这里我把他叫做s1s2。题目中要求在s1之后,s2之前。如果你是使用两个find来做的话,感觉就会变复杂(当时我就是这么做的,最后放弃了)。

换个思路
我们为什么不直接找s1+s2这个字符串呢?
这样子做的优点有两点:

  1. 只需要用一个find,不需要两个find的结果来回比较了,比较消耗时间,
  2. 可以减少很多选择的对象,加快速度。

简化到这里就是一句话s.find(s1+s2)

粘贴我们前面的所选部分

我们这里就直接使用insert,不过这里稍微注意,我们前面是找到一整块的s1+s2,所以我们插入的时候应该这样s.insert(pos+s1.length(), s3)

到这里基本完事。

完整代码

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


string s1, s2, s3, s;
int n, a, b;

int main()
{
	cin >> s >> n;
	while(n--) {
		cin >> a >> b >> s1 >> s2;
		s3 = s.substr(a-1, b - a + 1);
		s.erase(a-1, b - a + 1);
		int len = s1.length();
		s1 += s2;
		int pos = s.find(s1);
		if (pos != -1) s.insert(pos + len, s3);
		else s.insert(s.length(), s3);
	}
	cout << s;
	return 0;
} 
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值