深信服入职前编码训练21题--01

题目描述:

已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序

输入描述:

字符串,如:abc

输出描述:

可能的出栈顺序,每行一种顺序
示例1
输入

abc

输出

abc
acb
bac
bca
cba

分析:对输入进行全排列,然后依次判断每个排列是否符合出栈的规则。

 

解答:

 

 1 #include <iostream>
 2 #include <string>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 void swap(string &s, int i, int j){
 8     auto c = s[i];
 9     s[i] = s[j];
10     s[j] = c;
11 }
12 
13 //判断是否是出栈顺序
14 bool isvalid(const string &str, const string &ans){
15     stack<char> sc;
16     int i=0, j=0;
17     while(i<str.size()){
18         sc.push(str[i++]);
19         while(!sc.empty() && sc.top()==ans[j]){
20             sc.pop();
21             ++j;
22         }
23     }
24     return sc.empty();
25 }
26 
27 //回溯进行全排列
28 void backtrack(const string &str, string &ans, int a){
29     int len = str.size()-1;
30     if(a==len && isvalid(str,ans)){
31         cout<<ans<<endl;
32         return ;
33     }
34     for(int k=a; k<=len; ++k){
35         swap(ans,a,k);
36         backtrack(str,ans,a+1);
37         swap(ans,a,k);
38     }
39 }
40 
41 int main(){
42     string str, ans;
43     cin>>str;
44     ans = str;
45     backtrack(str, ans, 0);
46     
47     return 0;
48 }

 

posted @ 2020-05-13 16:57  T丶jl  阅读(688)  评论(0编辑  收藏  举报