zoukankan      html  css  js  c++  java
  • 全排列

    好的,我们来看这道题

    全排列

    总时间限制: 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 }
  • 相关阅读:
    .Net 控制台动态刷新使用
    VS 将!=转换成 ≠
    C# 自定义Html分页
    .NET MVC ModelBinder基本使用
    C# 重启电脑 程序自启动
    ASP.NET JsonResult返回日期格式及首字母大写解决
    java快速排序代码实现
    系统高可靠的设计需要考虑哪些方面
    sentinel源码学习--transport模块
    TiDB学习笔记分享--存储篇
  • 原文地址:https://www.cnblogs.com/yufenglin/p/10013777.html
Copyright © 2011-2022 走看看