做题感悟:全排列

Posted yufenglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了做题感悟:全排列相关的知识,希望对你有一定的参考价值。

好的,我们来看这道题

全排列

总时间限制: 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 }

 

以上是关于做题感悟:全排列的主要内容,如果未能解决你的问题,请参考以下文章

机器学习的一点感悟

LeetCode 1371 每个元音包含偶数次的最长子字符串 做题感悟

LeetCode 680 验证回文字符串 Ⅱ 做题感悟

做题感悟:爬楼梯

AGC005做题小记

区间dp的感悟