字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

代码

class Solution {
    string str;
    vector<string> ans;
    unordered_map<int, int> mp;
    unordered_map<char, int> hash;
public:
    void hashCalc() {
        for (int i = 0, k = 1; i < str.size(); ++i) {
            if (hash.find(str[i]) == hash.end()) {
                hash[str[i]] = k++;
            }
        }
    }

    vector<string> Permutation(string str) {
        if (str.size() > 0) {
            this->str = str;
            hashCalc();
            dfs(0, 0);
        }
        return ans;
    }
    
    void dfs(int p, int tag) {
        if (mp.find(tag) != mp.end()) {
            return;
        }
        mp[tag] = 1;
        if (p >= str.size()) {
            ans.push_back(str);
        }
     	//因为swap只交换一次,str会改变,所以需要记住交换前的,从而不影响下一轮操作,关键
        string tmp = str;
        for (int i = p; i < str.size(); ++i) {
            swap(str[p], str[i]);//只交换一次,后面不再交换回来,保证每次交换str[p+1,n]子串都是从最小的先开始
            dfs(p + 1,  10 * tag + hash[str[p]]);
        }
        str = tmp;
    }
};

posted on   jec  阅读(144)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示