剑指 Offer 38. 字符串的排列(回溯)

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

分析:

做排列问题需要注意给的字符串或数组是否允许包含重复元素,本题是允许包含重复元素的,区别于力扣的46题,在这里通过一个used数组来标记哪些元素使用过,避免一个元素使用多次(剪枝),再得到方案时在用unordered_map的自动去重机制过滤掉重复的组合(如给定s = “aab”, 从第一个a递归下去会有aab, 从第二个a递归下去也有aab,如果题目不包含重复元素,则不会出现这种问题)

ps:unordered_map的实现为哈希表,速度优于用红黑树实现的map。

class Solution {
    
    
public:
    vector<string> v;
    string tempS;
    unordered_set<string> ss;
    void backtracking(string& s, vector<bool>& used){
    
    
        if(tempS.size() == s.size()){
    
    
            if(ss.find(tempS) != ss.end()) return;
            else{
    
    
                ss.insert(tempS);
                v.push_back(tempS);
                return;
            }
        }
        for(int i = 0; i < s.size(); i++){
    
    
            if(used[i] == true) continue;  
            used[i] = true;
            tempS.push_back(s[i]);
            backtracking(s, used);
            tempS.pop_back();
            used[i] = false;
        }
        
    }
    vector<string> permutation(string s) {
    
    
        vector<bool> used(s.size(), false);
        backtracking(s, used);
        return v;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34612223/article/details/114328227