剑指 Offer 38 字符串的排列

Tag: 剑指-Offer Posted on 2022-02-26 13:14:44 Edited on 2022-02-26 13:14:44 Views: 142

概述

https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

回溯法

排列问题,难点在于如何避免重复项的出现。

为了避免重复项,我们做选择的时候,如果一个字符已经被选了,则不要再选了。

用哈希表非常合适!

class Solution {
public:
    vector<string> ans;
    int n;
    vector<string> permutation(string s) {
        n = s.size();
        unordered_map<char, int> m;
        for (auto c : s) m[c] ++;
        string path;
        backtrack(m, path);
        return ans;
    }

    void backtrack(unordered_map<char, int>& m, string& path) {
        if (path.size() == n) {
            ans.push_back(path);
            return;
        }
        for (auto iter = m.begin(); iter != m.end(); ++ iter) {
            if (iter->second != 0) {
                m[iter->first] --;
                path.push_back(iter->first);
                backtrack(m, path);
                path.pop_back();
                m[iter->first] ++;
            }
        }
    }
};

未经允许,禁止转载,本文源站链接:https://iamazing.cn/