爆搜问题
看这个,别看下面的视频 https://www.bilibili.com/video/av9830088
对应代码
1 class Solution { 2 public: 3 vector<string> result; 4 5 vector<string> Permutation(string str) { 6 if(str.length() == 0) 7 return result; 8 int n = str.size(); 9 dfs(str,0,n-1); 10 11 //对结果进行排序 12 sort(result.begin(), result.end()); 13 14 return result; 15 } 16 void dfs(string &str, int begin, int end) 17 { 18 //递归结束的条件:一条字符串的最后一位也排序完成 19 if(begin == end) 20 { 21 result.push_back(str); 22 return; 23 } 24 25 for(int i = begin;i <= end; i++) 26 { 27 //如果字符串相同,则不交换 28 if(str[i] == str[begin] && i != begin) 29 { 30 continue; 31 } 32 33 swap(str[begin],str[i]); 34 dfs(str, begin+1, end); 35 swap(str[begin],str[i]); 36 37 } 38 39 } 40 };
视频https://www.bilibili.com/video/av41342810?p=2
代码 字符串的排序
class Solution { public: vector<vector<int>> res; vector<int> path; vector<vector<int>> permutation(vector<int>& nums) { path.resize(nums.size()); dfs(nums, 0, 0, 0);//数组,当前要放的元素位置,上一个放的位置,当前的放的状态。 return res; } void dfs(vector<int> & nums, int u, int start, int state) { //state为二进制数 if (u == nums.size()) { //如果遍历完所有数,就说明找到了方案 res.push_back(path);//保存方案 return; } if (!u || nums[u] != nums[u-1]) start = 0;//如果是第一个数,或者当前数和上一个数不同,那么就可以从第0位开始枚举 //如果下一个数和当前数相同 for (int i = start; i < nums.size(); i ++){ //枚举每个位置,判断位置是不是被用过了 if(! (state >> i & 1)){//这个数的二进制表示中第i位是不是1,如果不是,表示这个位置没有被用过 path[i] = nums[u];//把当前数放到这个位(坑)上 dfs(nums, u + 1, i + 1, state + (1 << i));//上一个放的位置是i;state + (1 << i):把state的第i位从0变成1 } } } };