AcWing 1883. 删减

题意

农夫约翰希望从 S 中删除子串 T。

他在 S 中从头开始寻找子串 T,一旦找到,就将它从 S 中删除,然后再次从头开始寻找(而不是接着往下找)。

他重复这个操作直到 S 中没有子串 T 为止。

注意,删除一个子串 T 可能会导致一个新的子串 T 的出现。

请帮助约翰完成这些操作并输出最后的 S,保证最终字符串 S 不为空。。

数据范围

S 的长度不超过 106,T 的长度不超过 100 且不超过 S 的长度,字符串中只出现小写字母。

题解

  • 把字符串s想象成栈,一个一个字母往栈里加,位于栈顶的t.size()个字符恰好为t,则删除s结尾的t个字符,重复以上操作。
  • 不要硬模拟,复杂度不对,会tle
  • 需要注意的语法知识:
stk.substr(stk.size() - t.size()) //substr是从括号内给出下标到最后的子串
stk.erase(stk.end() - t.size(), stk.end()) //从第一个参数位置开始删除长度为第二个参数的子串
  • string erase的用法
    image

#include <iostream>
#include <string>
using namespace std;
 
int main ()
{
  string str ("This is an example phrase.");
  string::iterator it;
 
  // 第(1)种用法
  str.erase (10,8);
  cout << str << endl;        // "This is an phrase."
 
  // 第(2)种用法
  it=str.begin()+9;
  str.erase (it);
  cout << str << endl;        // "This is a phrase."
 
  // 第(3)种用法
  str.erase (str.begin()+5, str.end()-7);
  cout << str << endl;        // "This phrase."
  return 0;
}
  • Ac 代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    string s, t;
    cin >> s >> t;

    string stk;

    for (auto c: s)
    {
        stk += c;
        while (stk.size() >= t.size() && stk.substr(stk.size() - t.size()) == t)
            stk.erase(stk.end() - t.size(), stk.end());
    }

    cout << stk << endl;
    return 0;
}
posted @   小菜珠的成长之路  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示