ZOJ1004 Anagrams by Stack

该博客介绍了一种使用深度优先搜索(DFS)和回溯的方法来解决如何通过栈操作将字符串a转换为字符串b的问题。作者提供了一个C++代码示例,展示如何在确保目标字符串得到的情况下,按照字典序输出所有可能的出入栈顺序。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值