AcWing 1883. 删减
题意
农夫约翰希望从 S 中删除子串 T。
他在 S 中从头开始寻找子串 T,一旦找到,就将它从 S 中删除,然后再次从头开始寻找(而不是接着往下找)。
他重复这个操作直到 S 中没有子串 T 为止。
注意,删除一个子串 T 可能会导致一个新的子串 T 的出现。
请帮助约翰完成这些操作并输出最后的 S,保证最终字符串 S 不为空。。
数据范围
S 的长度不超过 ,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的用法
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架