• 全排列


    好的,我们来看这道题

    全排列

    总时间限制: 1000ms 内存限制: 65536kB
    描述

    给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

    输入
    输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
    输出
    输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。

    很显然,这是一道可以用很多方法解决的题,但是在这里我推荐一位奆佬的方法,虽然有点麻烦(小声吐槽)

    首先,由于输入是一个字符串,所以我们先开一个用于存储初始化自符串的数组a(字符串),将a输入后就来到了最为关键的阶段,这里用到了一个搜索的算法(虽然主体是递归)

    以第一个数作为第一位,从第一个数开始搜索,每搜索完一个就利用一个bool数组将其标记,之后便只搜索未标记的字符,并写入数组c(字符串)中,当字符串c的位数与a相同(用到了strlen(求长))时,就进行输出,再回溯到一 步,并取消标记,全部进行完成后再将第二个数作为第一位,依次类推。。。。

    我觉得讲的很明白了(显然不成立)

    最后,附上代码

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 bool b[1001];
     5 char s[1001],ans[1001];
     6 int len;
     7 void dfs(int i)
     8 {
     9     for(int j=0;j<len;++j)
    10     {
    11         if(b[s[j]]==0)
    12         {
    13             b[s[j]]=1;
    14             ans[i]=s[j];
    15             if(i==len-1)
    16             {
    17                 printf("%s
    ",ans);
    18             }
    19             else
    20             {
    21                 dfs(i+1);
    22             }
    23             b[s[j]]=0;
    24         }
    25     }
    26 }
    27 int main()
    28 {
    29     scanf("%s",s);
    30     len=strlen(s);
    31     dfs(0);
    32 }
  • 相关阅读:
    Flume案例:目录文件到HDFS
    Flume案例:本地文件到HDFS
    12c多租户架构下部署GoldenGate12c
    ogg_sqlserver_oracle_winerver2008
    ogg异构oracle-mysql
    搜索引擎 反向索引,为什么称之为反向索引?
    ORACLE 11G 之DATAGUARD搭建逻辑standby
    Java并发锁控制API详解
    Java中的锁分类与使用
    Spring Cloud入门(含案例介绍及源码)
  • 原文地址:https://www.cnblogs.com/yufenglin/p/10013777.html
Copyright © 2020-2023  润新知