剑指 Offer 38 字符串的排列

剑指 Offer 38 | 字符串的排列

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

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

示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
  • 限制:
    1 <= s 的长度 <= 8

思路:大问题分解为小问题,字符串的长度为len,固定当前字符,则当前字符固定时,字符串的全排列为剩下的len-1个字符的全排列(可以想象一下密码箱,固定一个密码,剩下的有多少种排列)。一直递归下去,遇到最后一个字符,保存当前字符串。因为字符会重复,所以要做一个判断,如果当前位置已经固定过该字符,就不重复固定。

void helper(vector<string>&res, string str, int index) {
    if (index == str.size() - 1) {
        res.push_back(str);
    }

    set<char> record;
    for (int i = index; i < str.size(); i++) {
        if (record.count(str[i])) // 该字符在当前位置已经固定过
            continue;
        record.insert(str[i]);
        
        swap(str[i], str[index]);
        helper(res, str, index + 1);
        swap(str[i], str[index]);
    }
}

vector<string> permutation(string s) {
    vector<string> res;
    helper(res, s, 0);
    return res;
}
posted @ 2022-12-21 11:12  卑以自牧lq  阅读(17)  评论(0)    收藏  举报