思路:
这道题要是不卡时间复杂度,是道大水题,然而字符串的长度到了6次方,若使用string中的erase函数,看似时间复杂度不高,其实,每次删除子字符串后,后边的字符串需要移动到前面来,最坏的情况下,时间复杂度能达到O(n*n)
。那么我可以想办法让字符串不要发生移动。可以一个个地将字符串加入到新字符串中,加一个字符就判断一次,判断是否满足删除条件。显然,这种想法跟栈的想法是一样的。
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);string str, s, d;cin >> str >> d;for (auto c : str){s += c;if (s.size() > d.size() && s.substr(s.size() - d.size(), d.size()) == d)s.erase(s.size() - d.size(), d.size());}cout << s;return 0;
}