模拟一道,要想 AC 很容易,但还是建议用 C++
的特惠礼包
这道题目一共有三个操作,所以就分成三个部分吧!
part 1 COPY
这个操作并不难,只需要用字符串 t 存住 s[l] ~ s[r] 的字符就行。上模拟代码
t = ""; // 覆盖原子串,所以要清空
for (int i = l; i <= r; i ++)
t += s[i];
可是我们是珂爱的 C++
,而 C++
给了我们一个好东西:substr
(起点,终点) ;我们怎么能不用呢?
从 l 开始取到 r,共有 r - l + 1 位,所以上面的代码可以一句话代替:t = s.substr (l, r - l + 1);
part 2 CUT
剪切其实就是 复制 + 删除。
复制的代码上面已经有了,不再赘述。
删除的代码这里提供三种:
1.暴力删除:
string S = "";
for (int i = 0; i < l; i ++)
S += s[i];
for (int i = r + 1; i < s.size(); i ++)
S += s[i];
s = S;
这种方法其实就是避开 l~r 的区间不放入另一个字符串中。
2.substr 删除:
看了刚才 COPY 的操作,有些脑瓜子强的同学们就想到了:可以用 substr 将字符串截开,接着只加上首尾段就行了吖!
代码:
string a = s.substr (0, l), b = s.substr (r + 1, s.size() - r - 1);
s = a + b;
看起来短了很多呢!其实不然,还有一种更简便的方法:erase(起点,终点)
我们可以直接删除 $s_l$ 到 $s_r$ 之间的字符,即 s.erase (l, r - l + 1);
。
part 3 PASTE
暴力起来也挺水(还是无耻的用 substr 吧,窝也累了)
string a = s.substr (0, p + 1), b = s.substr (p + 1, s.size() - p - 1);
s = a + t + b;
还是有一个玩意可以代替:insert(插入点,字符串):
s.insert (p + 1, t);
这篇题解就水到这了,求个赞qaq
题解中 a.substr(起点,距离)而不是a.substr(起点,终点)(不过没什么差距,仔细看文章都知道,除了我这样的眼瞎会直接用这个了,但凡我看的再仔细一点)
然后就是:
nb 还有很多用法,不过我只打了比较常用的,有兴趣可以自行查阅!
耶比耶比耶
erase的两个参数不都是地址吗,然后substr是下标和距离