题目描述:
已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序
输入描述:
字符串,如: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 }