【LeetCode-回溯】字串的排列
阿新 • • 發佈:2020-07-24
題目描述
輸入一個字串,打印出該字串中字元的所有排列。
你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。
示例:
輸入:s = "abc"
輸出:["abc","acb","bac","bca","cab","cba"]
說明: 1 <= s 的長度 <= 8
題目連結: https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
思路
使用回溯來做。一般使用回溯來做每一層搜尋的起點 start 都是根據上一層得到的。在求全排列問題時,每一次都是從頭開始,也就是從下標 0 開始搜尋。同時使用 visit 陣列標記在本輪搜尋中位置 i 是否已經被新增到答案當中去了。
程式碼如下:
class Solution { public: vector<string> permutation(string s) { if(s.empty()) return {}; vector<string> ans; unordered_set<string> lookup; // 用來去重 int start = 0; // 搜尋開始的位置 string cur = ""; vector<bool> visit(s.size(), false); dfs(s, start, cur, visit, lookup, ans); return ans; } void dfs(string& s, int start, string cur, vector<bool>& visit, unordered_set<string>& lookup, vector<string>& ans){ if(cur.size()==s.size()){ if(lookup.count(cur)==0){ ans.push_back(cur); lookup.insert(cur); } return; } for(int i=0; i<s.size(); i++){ if(!visit[i]){ cur += s[i]; visit[i] = true; dfs(s, i+1, cur, visit, lookup, ans); visit[i] = false; cur.pop_back(); } } } };
上面的程式碼中,變數 start 不是必須的,因為沒有用到這個變數,寫在裡面是為了和其他回溯的寫法統一起來。