贤鱼的刷题日常--1750:全排列--题目详解

193 阅读1分钟

本文已参与 ⌈新人创作礼⌋ 活动,一起开启掘金创作之路。

🏆今日学习目标: 🍀学习了解--1750:全排列 ✅创作者:贤鱼 ⏰预计时间:5分钟

请添加图片描述

@TOC

题目

  • 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'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

思路

一个递归函数 我们要求输入一个字符串,首先要求出字符串的长度

  • strlen好评

函数中我们就以字符串长度为边界条件,如果字符串长度大于输入的长度了,就结束程序,输出结果

如果还需要继续递归,我们就递归没有使用过的所有数据 题目就被解出来了

AC代码

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans,a[101086],youxi[10086];
	char p[10086];
void s(int x){
	if(x-1>=ans){
		for(int i=1;i<=ans;i++) printf("%c",p[a[i]]);
		cout<<endl;
		return ;
	}
	for(int i=0;i<ans;i++){
		if(youxi[i]!=0){
			continue;
		}
		youxi[i]=1;//判断一手有没有使用过
		a[x]=i;
		s(x+1);
		youxi[i]=0;//记得回溯的时候清零,不然影响后面程序运行
	}
}
int main(){
	cin>>p;
	ans=strlen(p);
	s(1);
}

请添加图片描述