1. 程式人生 > >劍指offer 面試題28:字串的排列

劍指offer 面試題28:字串的排列

題目:

輸入一個字串,按字典序打印出該字串中字元的所有排列。

例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

結果請按字母順序輸出。

解題思路:遞迴~~~

分兩步:

第一步:求出所有可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換;

第二步:固定一個字元,求後面所有字元的排列。此時,遞迴上面的做法。

這裡寫圖片描述

劍指offer給出的程式碼:

C語言版本

void Permutation(char* pStr, char* pBegin);

void Permutation(char* pStr)
{
    if
(pStr == NULL) return; Permutation(pStr, pStr); } void Permutation(char* pStr, char* pBegin) { if(*pBegin == '\0') { printf("%s\n", pStr); } else { for(char* pCh = pBegin; *pCh != '\0'; ++ pCh) { char temp = *pCh; *pCh = *pBegin
; *pBegin = temp; Permutation(pStr, pBegin + 1); temp = *pCh; *pCh = *pBegin; *pBegin = temp; } } }
class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> res;
        if (str.empty())
            return
res; Permutation(res, str, 0); sort(res.begin(), res.end()); return res; } void Permutation(vector<string> &array, string str, int begin) { if (begin==str.size()-1) array.push_back(str); for (auto i = begin; i != str.size(); ++i) { if (i != begin&&str[i]==str[begin]) //若有重複元素則跳過 continue; //第一次交換元素 swap(str[i] , str[begin]); Permutation(array, str, begin + 1); //恢復元素 swap(str[i], str[begin]); } } };

測試程式碼:

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

int main()
{
    sultion test;
    vector<string> res;
    string string1("abca");
    res = test.Permutation(string1);
    for (auto temp : res)
        cout << temp<<endl;


    system("pause");
    return 0;
}