全排列问题
全排列问题为给定n个元素,返回这些元素的全排列。
如给定abc
,其全排列为abc,acb,bac,bca,cab,cba
共6个。
全排列问题可以分为两种形式:有重复元素的全排列和无重复元素的全排列。
1. 无重复元素
给定元素中没有重复的元素。
如给定abc
,其全排列为abc,acb,bac,bca,cab,cba
。
对应问题:
leetcode: 面试题 08.07. 无重复字符串的排列组合
有两种方法,交换法和回溯法。
1.1 回溯法
回溯法很好理解,遍历所有元素,对于已经访问过的元素标记为已访问,则后续不再使用该元素。时间复杂度为O(n!)
class Solution {
public:
int n;
vector<bool> visit;
vector<string> res;
vector<string> permutation(string S) {
n = S.size();
visit = vector<bool>(n,false);
string temp(n,'\0');
help(S, temp, 0);
return res;
}
void help(string s, string temp, int idx){
for(int i = 0; i < n; i