字符串的排列
https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
问题思路:
1.每次选取一个出队,可以将问题划分为子问题。
2.每次出队固定第x位,然后和所有其他位交换使得同级问题被全部找出。
3.使用set去重,只有连着的两位才是不会重复的
class Solution { public: // 当前进入的s, vector<string> ans; void dfs(string s, int x){ if(x == s.length()-1){ ans.push_back(s); return; } set<int> st;
//每次固定第x位 for(int i=x; i<s.length(); i++){ //当不为连着的时候都是重复。 if(st.find(s[i])!=st.end()) continue; st.insert(s[i]); swap(s[i], s[x]); dfs(s, x+1);
// 可以不恢复现场,因为本题思路全部向下拆解为所有子问题。 swap(s[i], s[x]); } return; } vector<string> permutation(string s) { dfs(s, 0); return ans; } };