zoj 1004 Anagrams by Stack

题意:利用堆栈操作,将第一个单词转换成第二个单词 ,i代表入栈,o代表出栈,输出所有的可能,并且要按字典序排序。


dfs模拟堆栈的操作。。。


#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string a,b;

//pos源单词的位置,deep目标单词的位置,pop模拟出栈过程,push模拟入栈过程

void dfs(int pos,int deep, string operat,string push,string pop){
    int i;
    for(i=0;i<=pos-deep;i++)
        operat+="i ";
    operat+="o ";
    push+=pop[pos];
    pop.erase(pos,1);//删除从pos开始的1(n)个字符
    if(pop.size()==0)
        cout<<operat<<endl;
    else{
        //在pop中查找下一个要操作的位置
        for(i=pop.size()-1;i>=pos;i--){
            if(pop[i]==b[push.size()])
                dfs(i,pos,operat,push,pop);
        }
        //要操作的字符就在当前位置的前面
        if(pos>0 && pop[pos-1]==b[push.size()]){
            dfs(pos-1,pos,operat,push,pop);
        }
    }
}


int main(){
    int i;
    while(cin>>a>>b){
        puts("[");
        //模拟构造目标字符串
        for(i=a.size()-1;i>=0;i--){//这样的原因是为了满足字符串的顺序
            if(a[i]==b[0])
                dfs(i,0,"","",a);
        }
        puts("]");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值