全排列题解

全排列

时间限制:1000ms 内存限制:128MB 栈限制:128MB

题目描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' <'b' < ... <'y'<'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入格式

只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出格式

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。

字母序如下定义:

已知 S = s 1 s 2 . . . s k S=s_{1}s_{2}...s_{k} S=s1s2...sk

则S<T等价于,存在p(1<=p<=k),使得s1=t1,s2=t2,...,sp−1=tp−1,sp<tp成立。

样例

样例 1 输入:

abc

样例 1 输出:

abc

acb

bac

bca

cab

cba

样例解析

(空)

数据规模

(空)

问题分析

全排列的意思:

abc是一个长度为3的字符串

把abc拆成a,b,c

能有多少种排列组合

全部输出

如abc有6种组合,则输出

abc

acb

bac

bca

cab

cba

目标是输出当前字符串的所有排列组合,不用输出个数

思路 肯定没人看

这道题我用的深搜 我在想能不能打表

当然不能打表 能累死人

他的组合有很多种,还有不同的字母的排列组合,这样会死

所以用深搜

先以例子abc来看

接下来是第一位选择a的图片

第一位选择了a

第二位又选择了b

第三位选择了c

组成abc

发现没有任何组合,回溯到有另外组合的选择时候

第一位选择了a

第二位选择了c

第三位选择了b

组成acb

发现没有任何组合,回溯到有另外组合的选择时候

以上为第一位选择a的情况

以此类推,我们可以这样:

第一位选择了b

第二位选择了a

第三位选择了c

组成bac

发现没有任何组合,回溯到有另外组合的选择时候

第一位选择了b

第二位选择了c

第三位选择了a

组成bca

发现没有任何组合,回溯到有另外组合的选择时候

第一位选择了c

第二位选择了a

第三位选择了b

组成cab

发现没有任何组合,回溯到有另外组合的选择时候

第一位选择了c

第二位选择了b

第三位选择了a

组成cba

发现没有任何组合,回溯到有另外组合的选择时候

没有其他选择,跳出

这就是深搜

本质就是不断地寻找,走不通了就回溯,直到回溯到有另外选择的时候

cpp 复制代码
void dfs(int u){//u代表第u个格子
	if(u==n+1){//出口,当遍历到了n+1就无法继续遍历
		for(int i=1;i<=n;i++){
			printf("%c",s[path[i]-1]);//输出得出的结果
		}
		puts("");
		return ;//跳出去
	}
	for(int i=1;i<=n;i++){
		if(st[i]==false){//没用过
			st[i]=true;//用过了
			path[u]=i;//试了当前可以的数
			dfs(u+1);//递归一遍,继续搜索一遍
			st[i]=false;//回溯,否则就不能再的到其他的结果
		}
	}
}

以上便是核心代码(具体看注释)

代码

cpp 复制代码
//在想
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int path[10001];
bool st[10010];//true代表用过
void dfs(int u){//u代表第u个格子
	if(u==n+1){//出口,当遍历到了n+1就无法继续遍历
		for(int i=1;i<=n;i++){
			printf("%c",s[path[i]-1]);//输出得出的结果
		}
		puts("");
		return ;//跳出去
	}
	for(int i=1;i<=n;i++){
		if(st[i]==false){//没用过
			st[i]=true;//用过了
			path[u]=i;//试了当前可以的数
			dfs(u+1);//递归一遍,继续搜索一遍
			st[i]=false;//回溯,否则就不能再的到其他的结果
		}
	}
}
int main(){
	cin>>s;
	n=s.size();
	dfs(1);
	return 0;
}

完结撒花!

相关推荐
ZhengEnCi4 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David4 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi5 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6185 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang5 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703836 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02146 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi8 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang8 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!8 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法