首页 > 学院 > 开发设计 > 正文

递归法解全排列

2019-11-11 03:57:53
字体:
来源:转载
供稿:网友

总时间限制: 1000ms 内存限制: 65536kB

描述

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

样例输出

abcacbbacbcacabcba

使用递归来解决全排列问题

主要思路是:

1. 输入一串字符串(已按序排列)和需要在输出数组中占有的位置 2. 判断该位置是否到达边缘 3. 若是,则进行输出 4. 若不是,则将其中每一个字符依次当作第一个字母并将剩下的字母送去排列,同时位置加一

#include <iostream>#include <cstring>using namespace std;char tmp[100];//用于输入int tmpSize;char out[100];//用于输出void PRint(); //输出所有的可能void pailie(char *a, int i); // 从第i个开始把a之后的填充进去int main(){ cin >> tmp; tmpSize = strlen(tmp); pailie(tmp,0); return 0;}void print(){ for(int j=0;j<tmpSize;j++){ cout << out[j]; } cout << endl;}void pailie(char *a, int i){ if(i==tmpSize){ print(); return; } for(int j=0;j<strlen(a);j++){//把除了当第一个的字符以外的其他字符拿出来送去递归 out[i]=a[j]; char tt[100]={'/0'};//必须要初始化为了以后的strlen函数 for(int m=0;m<j;m++){ tt[m]=a[m]; } for(int n=j+1;n<strlen(a);n++){ tt[n-1]=a[n]; } pailie(tt,i+1); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表