ZOJ1004 Anagrams by Stack

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值