全排列问题解析与实现
题目描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
输入要求:
- 仅一行,包含一个由不同小写字母组成的字符串。
- 字符串长度在 1 到 6 之间(包括 1 和 6)。
- 输入的字符串已经按照从小到大的顺序排列。
输出要求:
- 输出该字符串的所有排列方式,每行一个排列。
- 排列需要按照字典序排列。具体来说,对于两个排列
S
和T
,如果存在某个位置p
,使得S[1..p-1] == T[1..p-1]
且S[p] < T[p]
,则S
应排在T
前面。
示例:
输入:
abc
输出:
abc acb bac bca cab cba
提示:
- 禁止使用 STL(标准模板库)及其相关调用。
解题思路
1. 什么是全排列?
全排列是指将一组元素的所有可能排列方式列出。例如,给定字符串 "abc",它的全排列是:
abc, acb, bac, bca, cab, cba
需要注意的是,题目要求输出结果按照字典序排列,因此我们需要保证生成的排列是有序的。
2. 如何生成全排列?
我们可以使用深度优先搜索(DFS)算法来生成所有全排列。具体步骤如下:
- 使用一个数组
temp
来存储当前生成的排列。 - 使用一个布尔数组
vis
来标记每个字符是否已经被使用。 - 按照递归的方式逐层选择字符,直到生成完整的排列。
- 当生成一个完整的排列时,将其输出。
- 代码如下:
-
#include <iostream> using namespace std; char temp[8]; string a; int len; bool vis[8]; void dfs(int step){ if(step==len) { for(int i=0;i<len;i++){ cout<<temp[i]; } cout<<endl; return; } else{ for(int i=0;i<len;i++){ if(vis[i]==0){ temp[step]=a[i]; vis[i]=1; dfs(step+1); vis[i]=0; } } } } int main() { cin>>a; len=a.length(); dfs(0); return 0; }