欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客网机试题:全排列

程序员文章站 2024-03-17 14:43:10
...

全排列

题目描述

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

输入描述:

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

输出描述:

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

输入

abc

输出

abc
acb
bac
bca
cab
cba

使用STL标准库函数

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    string str;
    while(getline(cin,str))
    {
        sort(str.begin(),str.end());
        do{
            cout << str << endl;
        }while(next_permutation(str.begin(), str.end()));
        cout << endl;
    }
    return 0;
}

使用递归

//算法思想:全排列的n皇后问题思路,对问题进行递归实现。
#include <iostream>
#include <string.h>
#include <algorithm>
#define max 7
using namespace std;

//P为当前排列,hashTable记录x是否已经在p中
int n;                            //n为字符串长度,当前处理排列的index位
int hashTable[max] = {0};
char p[max];                     //储存全排列结果的数组

void generateP(int index,char str[])
{
    if(index == n)                     //递归边界
    {
        for(int i=0;i<n;++i)
        {
            cout << p[i];              //输出当前排列
        }
        cout << endl;
        return;
    }
    for(int x=0;x<n;++x)
    {
        if(hashTable[x] == 0)             //如果x不在p[0]~p[index-1]中
        {
            p[index] = str[x];            //令p的index位为先,即把str[x]加入当前排列
            hashTable[x] = 1;             //记x已经在p中

            generateP(index+1,str);       //处理排列的index+1位,index会从 0 增加到 n

            hashTable[x] = 0;             //已处理完p[index]为x的子问题,还原状态
        }
    }
}

int main(int argc, char const *argv[])
{
    char str[max];
    while(cin >> str)
    {
        n = strlen(str);
        sort(str,str+n);        
        generateP(0,str);
        cout << endl;
    }
    return 0;
}

 

 

 

 

 

相关标签: 机试