栈和表达式题目讲解

烤牛排

题目:

农夫约翰最近为他的奶牛们订了很多杂志,这样在产奶的季节,这些奶牛就不会觉得很无聊了。但是最近,其中一本杂志刊登了有关如何烤出美味的牛排的文章,约翰觉得这个不能给奶牛们看。

这篇文章是一个最大长度不超过\(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;
}
posted @ 2026-07-03 13:19  zhhhanry  阅读(7)  评论(0)    收藏  举报