剪切粘贴(字符串)

399 阅读2分钟

L1-094 剪切粘贴 (pintia.cn)

原题题面

image.png

题目描述

给定一个字符串 ssnn 个操作,每次操作如下:

  • 输入两个数字 llrr,将 ss 中第 ll 到第 rr 个字符删去,并保存到剪切板。
  • 输入两个字符串 s1s1s2s2,在修改后的 ss 中寻找子串 s1+s2s1+s2,若可以找到,则在 sss1s1s2s2 之间插入剪切板的内容,若无法找到,则将剪切板的内容添加到 ss 的末尾。

两个操作是成对出现的。

输入样例:

AcrosstheGreatWall,wecanreacheverycornerintheworld
5
10 18 ery cor
32 40 , we
1 6 tW all
14 18 rnerr eache
1 1 e r

输出样例:

he,allcornetrrwecaneacheveryGreatWintheworldAcross

题目分析

本题是对 字符串 的考察,主要是对 stringfindsubstr 函数的考察。

  • str.find(string  s,int  pos)str.find(string\; s, int\; pos)

本函数意为在字符串 strstr 中寻找 ss 的第一个位置下标,若找不到则返回 -1。第二个参数 x 意为从 strstr 的下标 pos 开始向后寻找,可不填意为从 0 开始。

  • str.substr(int  pos,int  n)str.substr(int\; pos, int\; n)

本函数意为在字符串 strstr 中得到初始位置为 pos,长度为 nn 的子串。第二个参数可不写,意为从 pos 开始到字符串结尾。

对于每次操作,我们首先将原串进行切割,将切割下来的子串保存下来,然后再对新串进行寻找输入的前缀,并比较后缀是否正确。最后对于不同的结果进行本次操作最终串的拼接。

注意字符串中满足前缀的位置可能不止一个,然而后缀不一定满足,需要多次遍历。若存在多个满足要求的前后缀,仅对位置最靠前的进行操作。

Accept代码

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string str; cin >> str;
    int t; cin >> t;
    while (t --)
    {
        int l, r;
        cin >> l >> r;
        string st = str.substr(0, l - 1) + str.substr(r);
        string sf = str.substr(l - 1, r - l + 1);
        string sl, sr;
        cin >> sl >> sr;
        int nl = sl.size(), nr = sr.size();
        int k = st.find(sl);
        while (k != -1 && st.substr(k + nl, nr) != sr)
        {
            k = st.find(sl, k + 1);
        }
        if (k != -1) st = st.substr(0, k + nl) + sf + st.substr(k + nl);
        else st += sf;
        str = st;
    }
    cout << str;
    return 0;
}

碎碎念

这是我的第一次天梯赛,也应该是我的最后一场天梯赛。坦然来说,这个结果是我当时那种心态能做到的全部,每个人都会在失利后觉得自己应该能做的更好,但事已至此,我们已无法改变。

最近的生活多少缺少了一些挫折,自己的心态也趋于安逸,这次经历无疑是一次警醒,它提醒我应该去做什么。

只是事后想起,还是会感到遗憾吧。

对不起我的队友。