美文网首页
字符串全排列

字符串全排列

作者: 九楼记 | 来源:发表于2022-04-08 23:33 被阅读0次

剑指 Offer 38. 字符串的排列
字符串题目还是经常会遇到。

解法1:递归加去重

先固定一个位置,然后和其他位置的元素交换,依次往后推,当是最后一个时,是返回结果。

class Solution {
public:

    vector<string> permutation(string s) {
        vector<string> ret;
        sort(s.begin(), s.end());
        helper(ret, s, 0, s.size() - 1);
        return ret;
    }
    void helper(vector<string>& ret, string& s, int left, int right) {
        if (left == right) {
            ret.push_back(s);
            return;
        }
        set<int> st;
        for (int i = left; i <= right; ++ i) {
            if (st.find(s[i]) != st.end()) {
                continue;
            }
            st.insert(s[i]);
            swap(s[i], s[left]);
            helper(ret, s, left + 1, right);
            swap(s[i], s[left]);
        }
    }
};
[链接](https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/)

解法2:回溯

class Solution {
public:
    vector<string> rec;
    vector<int> vis;

    void backtrack(const string& s, int i, int n, string& perm) {
        if (i == n) {
            rec.push_back(perm);
            return;
        }
        for (int j = 0; j < n; j++) {
            if (vis[j] || (j > 0 && !vis[j - 1] && s[j - 1] == s[j])) {
                continue;
            }
            vis[j] = true;
            perm.push_back(s[j]);
            backtrack(s, i + 1, n, perm);
            perm.pop_back();
            vis[j] = false;
        }
    }

    vector<string> permutation(string s) {
        int n = s.size();
        vis.resize(n);
        sort(s.begin(), s.end());
        string perm;
        backtrack(s, 0, n, perm);
        return rec;
    }
};

字典序排列

class Solution {
public:
    bool nextPermutation(string& s) {
        int i = s.size() - 2;
        while (i >= 0 && s[i] >= s[i + 1]) {
            i--;
        }
        if (i < 0) {
            return false;
        }
        int j = s.size() - 1;
        while (j >= 0 && s[i] >= s[j]) {
            j--;
        }
        swap(s[i], s[j]);
        reverse(s.begin() + i + 1, s.end());
        return true;
    }

    vector<string> permutation(string s) {
        vector<string> ret;
        sort(s.begin(), s.end());
        do {
            ret.push_back(s);
        } while (nextPermutation(s));
        return ret;
    }
};

Reference

[1] https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/01.06.html

相关文章

  • 字符串全排列

    题目描述 对给定的n位字符串全排列 解题思路 n位的字符串的全排列,先确定第0位,然后对后面n-1位进行全排列,在...

  • 关于数组的一些操作【python】

    递归的应用:求输入字符串的全排列 求输入字符串的全排列递归完成,也可以直接使用库函数 结果展示: ————————...

  • 递归算法

    问题1:给定不重复的字符串,如123,给出全排列 分析:算123的全排列,首先算以1开头的23的全排列,然后再算以...

  • 字符串全排列

    经常会遇到字符串全排列的问题。例如:输入为{‘a’,’b’,’c’},则其全排列组合为abc,acb,bac,bc...

  • 字符串全排列

    题目:https://www.nowcoder.com/practice/fe6b651b66ae47d7acce...

  • 字符串全排列

  • 字符串全排列

    题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能...

  • 字符串全排列

    题目:输入字符串,输出该字符串的全排列。样例:输入"abc",输出"abc,acb,bac,bca,cba,cab...

  • 字符串全排列

    剑指 Offer 38. 字符串的排列[https://leetcode-cn.com/problems/zi-f...

  • 经典面试题34 - 字符串的全排列

    问题 给定两个字符串,如何判断一个是否为另一个的全排列字符串。 全排列 - 通过改变顺序可以使得两个字符串相等。 ...

网友评论

      本文标题:字符串全排列

      本文链接:https://www.haomeiwen.com/subject/bfmusrtx.html