预计阅读时间:5分钟
原题
描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
样例输入
abc
样例输出
abc acb bac bca cab cba
思路
使用dfs即可。关于dfs如何使用,请阅读我的关于dfs的讲解文章。
深度优先搜索(DFS)_Hacket_徐的博客-CSDN博客深度优先搜索(Depth First Search),是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件)。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。...https://blog.csdn.net/weixin_46522531/article/details/126353591?spm=1001.2014.3001.5501vis里存的是当前字母有没有使用,p里存的是当前组合。从0到len一次放置每一个字母,直到全部放完,就是一个解,还得找更多解。
代码
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=8;
char a[maxn];
char p[maxn];
bool vis[maxn]={false};
int len=0;
void dfs(int x)
{
if(x==len)
{
cout<<p<<endl;
return;
}
else
{
for(int i=0; i<len; i++)
{
if(!vis[i])
{
vis[i]=true;
p[x]=a[i];
dfs(x+1);
vis[i]=false;
}
}
}
}
int main()
{
cin>>a;
len=strlen(a);
dfs(0);
return 0;
}
希望本博客对大家有所帮助