剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)
生活随笔
收集整理的這篇文章主要介紹了
剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
輸入一個字符串,打印出該字符串中字符的所有排列。
你可以以任意順序返回這個字符串數組,但里面不能有重復元素。
示例: 輸入:s = "abc" 輸出:["abc","acb","bac","bca","cab","cba"]限制: 1 <= s 的長度 <= 8來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
相關題目:
LeetCode 46. 全排列(回溯)
LeetCode 47. 全排列 II(回溯+搜索剪枝)
2. 解題
class Solution {int n;vector<string> ans;string str; public:vector<string> permutation(string s) {sort(s.begin(), s.end());//先排序,后面好剪枝,跳過重復的n = s.size(); vector<bool> visited(n,false);//訪問過某字符了bt(s,0,visited);return ans;}void bt(string& s, int count, vector<bool>& visited){if(count == n){ans.push_back(str);return;}for(int i = 0; i < n; ++i){if(!visited[i]){if(i != 0 && s[i-1] == s[i] && visited[i-1])//if(i != 0 && s[i-1] == s[i] && !visited[i-1])continue;//前一個字符等于當前,跳過//有無!差別是剪枝順序差別//推薦第二種寫法,剪枝更徹底visited[i] = true;str.push_back(s[i]);bt(s,count+1,visited);str.pop_back();visited[i] = false;}}} };參考解題
總結
以上是生活随笔為你收集整理的剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 76. 最小覆盖子串(
- 下一篇: LintCode 1683. 杀怪兽(队