最近在牛客和領扣上刷題,碰到了一些全排列的問題,總結一下。我們首先來看乙個問題?
題目**:字串的排列
題目描述:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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位進行全排列.由...