Anagrams by Stack
给出两个字符串a和b,需要将字符串a通过一系列入栈、出栈操作使得最终出栈的字符串与b相同,按字典序输出所有可实现方法的出入栈顺序。
思路:
求所有方案–>dfs搜索+回溯
只有当栈顶元素与目标串当前位置相同时,才进行出栈操作,故最终一定能够得到目标串!
注意输出:结尾要有空格!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
string s,t;
int len;
stack<char>sta;
vector<char>ans;
void dfs(int i,int j){
if(i==len&&j==len){//原始串全部入栈,目标串已经得到
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<" ";
}
cout<<endl;
return;
}
//入栈(原始串未完全入栈)
if(i<len){
sta.push(s[i]);
ans.push_back('i');
dfs(i+1,j);
sta.pop();//回溯
ans.pop_back();
}
//出栈(目标串还未得到,且栈顶元素与目标串当前位置相同)
if(j<i&&j<len&&sta.top()==t[j]){
char tmp=sta.top();
sta.pop();
ans.push_back('o');
dfs(i,j+1);
sta.push(tmp);//回溯
ans.pop_back();
}
}
int main(){
while(cin>>s>>t){
len=s.size();
ans.clear();//注意清空
while(!sta.empty()) sta.pop();
cout<<"["<<endl;
dfs(0,0);
cout<<"]"<<endl;
}
return 0;
}