C++打印一個字符串的全部排列,要求不要出現重複的排列

1. 題目

打印一個字符串的全部排列,要求不要出現重複的排列.比如給字符串abc, 那麼需要我們輸出abc,acb, bac, bca, cab,cba.

2. 思路

我們主要是藉助遞歸思想.

  1. 將每個元素都與子數組的第一個元素交換
  2. 再求剩餘部分的全排列
  3. 求完後再交換會來,復原原數組,這樣是防止出現重複元素

一開始看網上的代碼實在是不知所云,後來去網上找個視頻,感覺不錯.[算法教程] 全排列

3. 代碼

#include <iostream>

void Swap(char* str, int i, int j) {
    char temp = str[i];
    str[i] = str[j];
    str[j] = temp;
};

void PrintAllPermutations(char* str, int start, int end) {
    if (start == end) {
        for (int i = 0; i <= end; ++i) {
            std::cout << str[i];
        }
        std::cout << "\n";
    } else {
        for (int i = start; i <=end; ++i) {
            Swap(str, start, i);
            PrintAllPermutations(str, start + 1, end);
            Swap(str, start, i);
        }
    }
}

int main()
{
    std::string res = "abcd";
    PrintAllPermutations((char*)res.c_str(), 0, res.size() - 1);
    return 0;
}

在這裏插入圖片描述

下次遇到不會的,還是先看一些視頻感覺更直觀一點.

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