Nitori擅长制作各种各样精巧的道具。
这一天,Nitori找来n个不同的零件放在桌子上,将它们排列成一排,接着她便拿出一个被她称为“栈”的神奇道具,这个道具可以将无数多个零件放进去,并且也可以按照与放入顺序相反的顺序将零件取出来(即后放入的零件必须先取出来),并且她还可以只取出一部分后继续放入其它的零件,而不必一次性全部取完。
Nitori十分喜爱这个叫做“栈”的道具,今天,她想用“栈”将桌上的零件调整一下排列顺序,她会把桌上的零件从左到右依次放入“栈”中,并且在任意时刻,她都可以将若干个先前放进栈中的零件取出(需要按照“栈”的后入先出顺序),并从左到右在桌子上摆放出来。
她想知道是否可能将桌上物品的排列s,通过上述操作,转化为另一种排列t。
输入描述:
第一行输入一个正整数n,表示n个零件。
第二行输入一个长度为n,由不同小写字母组成的字符串s,表示初始从左到右排列的n种零件。
第三行输入一个长度为n,由不同小写字母组成的字符串t,表示Nitori希望得到的排列。
数据规范:
1≤n≤26.
- 所有字符串保证只含有小写字母。
输出描述:
如果能够通过“栈”将排列s变成t,则输出"Yes",反之输出"No"。(不包含双引号,大小写任意)
示例1
输入
1
a
o
输出
No
示例2
输入
1
c
c
输出
Yes
示例3
输入
7
abcedfh
aecbfdh
输出
Yes
说明
如果使用u表示入栈,使用o表示出栈,则此组数据可通过操作:
uouuuooouuoouo
从s排列得到t排列。
栈的简单应用,先把字符存到push,pop两个数组里,两个指针,i,j,然第一个字符串从第i个元素开始依次进栈,如果此时栈顶元素等于pop的数组第j个元素,出栈,依次进行下去。
#include <iostream>
#include <stack>
using namespace std;
bool isPopSeries(char push[],char pop[],int length)
{
if(!push||!pop||length<=0)
return false;
stack<char> temp;
int pushNum=0;
int i = 0;
while(i < length)
{
while(temp.empty()||temp.top()!=pop[i])
{
if(pushNum < length)
temp.push(push[pushNum++]);
else
return false;
}
if(!temp.empty()&&temp.top()==pop[i])
{
temp.pop();
i++;
}
}
return true;
}
int main()
{
int n;
char pushArray[100],popArray[100];
cin>>n;
getchar();
gets(pushArray);
gets(popArray);
if(isPopSeries(pushArray,popArray,n))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
system("pause");
return 0;
}
还有这个版本的
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e2+10;
int sum,n;
char push[maxn],pop[maxn],a[maxn],b[maxn];
bool check()
{
int i=0,j=0;
stack<char> mystack;
while(i < n)
{
mystack.push(push[i]);
i++;
while(!mystack.empty() && mystack.top() == pop[j])
{
mystack.pop();
j++;
}
}
if( mystack.empty() && j==n)
return true;
return false;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>push[i],a[i]=push[i];
for(int i=0;i<n;i++)
cin>>pop[i],b[i]=pop[i];
sort(a,a+n);
sort(b,b+n);
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
{
cout<<"No"<<endl;
return 0;
}
}
if(check())
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
//system("pause");
return 0;
}