剑指offer 字符串的排列

本文介绍了一种利用C++ map实现的字符串排列算法,该算法能够处理包含重复字符的情况,并按字典序输出所有可能的排列组合。
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:题目中会出现重复的字母,这里采用了取巧的办法,使用了C++的map来实现,首先map可以过滤到重复的字符串,其次map还可以自动排序,所以只用递归求字符串排列就可以了。当然了如果采用其他办法,过滤了重复字符串,最后采用桶排序顺序输出应该更简单一点吧。其实最取巧的莫过于采用STL中的next_permutation,一个函数解决所有问题。
class Solution {
public:
    mapmap_t;
    int togetherstr(string str,vector ve)
    {
        if(ve.size()==0)
        {
            map_t[str]++;
            return 1;
        }
        for(int i=0;ivec = ve;
            string stri = str+vec[i];
            vec.erase(vec.begin()+i);
            togetherstr(stri,vec);
        }
        return 1;
    }
    vector Permutation(string str) 
    {
        vectorres;
        vectorvec;
        int len = str.length();
        for(int i=0;i ve = vec;
            string stri = ve[i];
            ve.erase(ve.begin()+i);
			togetherstr(stri,ve);
        }
        map::iterator iter;
        
        for(iter = map_t.begin();iter!=map_t.end();iter++)
        {
            res.push_back(iter->first);
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值