栈和表达式题目讲解
烤牛排
题目:
农夫约翰最近为他的奶牛们订了很多杂志,这样在产奶的季节,这些奶牛就不会觉得很无聊了。但是最近,其中一本杂志刊登了有关如何烤出美味的牛排的文章,约翰觉得这个不能给奶牛们看。
这篇文章是一个最大长度不超过\(10^6\)的字符串S,在这个文章里,约翰要删掉子串T,子串T的长度不超过100。他是这么删的:首先从左到右找到第一个出现的子串T,然后把这个子串删掉,接下来继续找到最左边的子串T删掉,如此循环下去直到S串里面没有子串T。
请你帮助约翰计算最终的S串。
题目条件:
1.串S的长度不超过\(10^6\),串T的长度不超过100。
2.所有字符都是从a到z的小写字母。
分析
只需要不断往栈中放入串中的每一个字母,然后不断删除结尾的T串即可,每个字母最多进栈一次出栈一次。
时间复杂度:\(o(|s|*|t|)\)。
#include<bits/stdc++.h>
using namespace std;
int s;
string x,t;
char a[1000001];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>x>>t;
for(int i=0;i<x.size();i++)
{
int p=0;
s++;
a[s]=x[i];//每一个字符进栈
for(int j=s-t.size()+1;j<=s;j++)
if(t[j-s+t.size()-1]!=a[j])
{
p=1;
break;
}
//由于每次都会进行删除操作,所以S串末尾最多出现一个T串
if(!p)
s-=t.size();//删除T串
}
for(int i=1;i<=s;i++)
cout<<a[i];
return 0;
}

浙公网安备 33010602011771号