题解:UVA732 Anagrams by Stack

封面

题意简述:

多组数据。
每组数据给出两个字符串(源字符串和目标字符串),输出所有通过栈操作将源单词转为目标单词的操作字符串(i 表示入栈,o 表示出栈)。
操作字符串按字典序输出。

思路:

使用 DFS 算法,暴力模拟出栈入栈操作,为了保证按字典序从小到大输出,应该优先模拟入栈操作。因为入栈用字母 i 表示,出栈用字母 o 表示,很明显 i 的字典序比 o 小。

特别注意:本题不允许行末多余空格。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
string st,en;
stack<char>sta;
int lenen;
void dfs(int s,int e,string op/*操作*/){
if(e==lenen){
cout<<op<<"\n";
return;
}
// cout<<op<<"\n";
// i 的 ASCII 码值小于 o 为了保证字典序从小到大,先从小的开始
if(s<st.size()){// 模拟入栈
sta.push(st[s]);
dfs(s+1,e,op+"i ");
sta.pop();// 回溯
}
if(!sta.empty()&&sta.top()==en[e]){
char k=sta.top();
sta.pop();
if(e+1!=lenen)dfs(s,e+1,op+"o ");// 不要问为什么这么写
else dfs(s,e+1,op+"o");// 因为直接 dfs(s,e+1,op+"o ") 会 PE
sta.push(k);
}

return;
}
int main(){
while(cin>>st>>en){
cout<<"[\n";
string a=st,b=en;
lenen=en.size();
sort(a.begin(),a.end());
sort(b.begin(),b.end());
if(a==b)dfs(0,0,"");// 特判类似于样例中的 st=long,en=short 两个字符串字符不一样的情况
cout<<"]\n";
}
return 0;
}