zoukankan      html  css  js  c++  java
  • zoj1004Anagrams by Stack

    /*
    题意:给出两个字符串A,B,栈的压入弹出操作使A变成B,i表示输入,o表示输出。
    请求出所有可能的操作,按字典序输出。
    分析:已知边界条件是压入次数==A.size()&&弹出次数==B.size()。用递归回溯求出所有可能的操作顺序
    */
    #include<iostream>
    #include<vector>
    #include<string>
    #include<stack>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    string s1,s2;
    stack <char> st;//存压入弹出的字母
    vector <char> io;//存操作顺序
    int l;
    bool able(string a,string b)
    {
    	int num1[100],num2[100];
    	memset(num1,0,sizeof(num1));
    	memset(num2,0,sizeof(num2));
    	if(a.size()!=b.size())return 0;
    	for(int i=0;i<a.size();i++)
    	    num1[a[i]-'a']++;
    	for(int i=0;i<b.size();i++)
    	    num2[b[i]-'a']++;
    	for(int i=0;i<26;i++)
    		if(num1[i]!=num2[i])return 0;
    	return 1;
    }
    void DFS(int i,int o)//i表示压入的次数,o表示弹出次数
    {
    	if(i==l&&o==l)
    	{
    		for(int k=0;k<io.size();k++)
    			cout<<io[k]<<" ";
    		cout<<endl;
    	}	
    	if(i<l)//这步在前保证了字典序输出
    	{
    		st.push(s1[i]);
    		io.push_back('i');
    		DFS(i+1,o);
    		io.pop_back();
    		st.pop();
    	}
    	if(o<l&&o<i&&st.top()==s2[o])//可以弹出满足条件
    	{
    		st.pop();
    		io.push_back('o');
    		DFS(i,o+1);
    		io.pop_back();
    		st.push(s2[o]);
    	}
    
    }
    int main()
    {
    
       while(cin>>s1>>s2)
       {
    	  
    	   if(!able(s1,s2)){cout<<"["<<endl;cout<<"]"<<endl;continue;}
    	   io.clear();
    	   l=s1.size();
    	   cout<<"["<<endl;
    	   DFS(0,0);
    	   cout<<"]"<<endl;
       }
    }
    
  • 相关阅读:
    怎么产生一个随机数
    C# 算速表达式
    Wpf OpenFileDialog
    完美世界自动更新程序
    只容许程序运行1个实例
    WPF 同一个程序 只允许 同时运行一个
    13 引用WINAPI
    winform窗体跟随窗体
    C#如何检测一个字符串是不是合法的URL
    WPF 下载网络文件 带进度条
  • 原文地址:https://www.cnblogs.com/sook/p/2035221.html
Copyright © 2011-2022 走看看