牛客網機試題:全排列

全排列

題目描述

給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'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;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章