做题感悟:全排列
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 }
以上是关于做题感悟:全排列的主要内容,如果未能解决你的问题,请参考以下文章