【剑指38】字符的排列

方法一:dfs + 剪枝:时间O( n ! n! n!),空间O(n)

解题思路:

  • 对字符串进行全排列,将每次不同排列的结构插入数组中
  • 通过dfs + 循环遍历数组,并交换元素位置,实现全排列
  • 全排列过程中可能出现数组中多个元素重复占用同一位置,造成结果重复
  • 因此采用一个固定大小的数组,每排一次位置让元素对应下标++
class Solution {
public:
    vector<string> ans;
    vector<string> permutation(string s) 
    {
        dfs(s, 0);
        return ans;
    }
    void dfs(string& s, int pos)
    {
        // 直接对 s 进行全排列
        if (pos == s.size() - 1)
        {
            ans.push_back(s);
            return;
        }
        int board[1024] = { 0 };
        for (int i = pos; i < s.size(); ++i)
        {
            if (board[s[i]] != 0)
                continue;
            board[s[i]]++;
            swap(s[i], s[pos]);
            dfs(s, pos + 1);
            swap(s[i], s[pos]);
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值