zoukankan      html  css  js  c++  java
  • 深信服入职前编码训练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 }
  • 相关阅读:
    迭代器在LinkedList上的删除
    java多线程:CopyOnWriteArrayList
    vs中代码编译通过,但还是有红色波浪线
    vs中项目属性配置
    TortoiseGit安装与配置
    DC(device context)
    weak_ptr 使用
    C++ 中shared_ptr循环引用计数问题
    for_each与lambda表达式联合使用
    new 和 make_shared 在内存上的区别
  • 原文地址:https://www.cnblogs.com/tenjl-exv/p/12883417.html
Copyright © 2011-2022 走看看