演算法 字串全排列演算法

2021-09-27 05:57:44 字數 3047 閱讀 8375

最近在牛客和領扣上刷題,碰到了一些全排列的問題,總結一下。

我們首先來看乙個問題

題目**:字串的排列

題目描述輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

解題思路:使用遞迴的方式來實現,首先固定第乙個字元,求剩餘字元的排列求剩餘字元排列時跟原問題一樣

下面我們來看**實現

#include

#include

#include

#include

// 字元全排列

void

permutation

(std::string& str,

std::vector<:string>

& result,

int begin)

}else}}

intmain()

return0;

}

執行結果如下

下面我們來看一下**的執行過程

同理,我們也可以列印數字的全排列,**如下

#include

#include

#include

// 數字全排列

void

permutation

(std::vector<

int>

& arr,

std::vector<:vector>

int>>

& result,

int begin)

for(

int i = begin; i <

(int

)arr.

size()

;++i)

}int

main()

; std::vector<:vector>

int>> result;

permutation

(arr, result,0)

;for

(int i =

0; i <

(int

)result.

size()

;++i)

std::cout << std::endl;

}return0;

}

結果如下

全排列除了可以使用遞迴自己實現外,還可以使用c++標準庫中的prev_permutation和next_permutation函式來實現

prev_permutation和next_permutation的區別:

庫函式使用**示例

使用next_permutation實現數字全排列

#include

#include

#include

intmain()

;// 需要先排序

std::

sort

(arr.

begin()

, arr.

end())

; std::vector<:vector>

int>> result;

result.

push_back

(arr)

;while

(std::

next_permutation

(arr.

begin()

, arr.

end())

)for

(int i =

0; i <

(int

)result.

size()

;++i)

std::cout << std::endl;

}return0;

}

執行結果如下

使用prev_permutation實現字串的全排列

#include

#include

#include

#include

#include

intmain()

for(

const

auto

& e : result)

return0;

}

執行結果如下

字串全排列演算法

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 這是典型的遞迴求解問題,遞迴演算法有四個特性 對於字串的排列問題 如果能生成n 1個元素的全排列,就能生成n個元素的全排列。對於只有乙個元素的集...

演算法 字串的全排列

from 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c 所能排列出來的所有字串 abc acb bac bca cab 和 cba。解法一 遞迴實現 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素...

演算法 字串之全排列

字串的全排列是字串類的演算法題的乙個考察點,屬於普通問題,它有兩種實現方法,遞迴演算法和非遞迴演算法,非遞迴的方法要稍微難一點,以下會依次進行介紹。演算法思想 求n位的字串的全排列,先確定第0位,然後對後面n 1位進行全排列,在對n 1為進行全排列時,先確定第1位,然後對後面的n 2位進行全排列.由...