您的位置:首页 > Web前端

剑指offer:字符串的排列

2016-03-08 19:50 525 查看


题目描述

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

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> strVec;
        if (str.size() == 0){
            return strVec;
        }
        Permutation(str, 0, strVec);
        sort(strVec.begin(), strVec.end());
        return strVec;
    }
    //字符串的排列,先选择第一个位置的字母,第一个位置的字母选定以后,再对字符串中剩余的其他字母排序
    //一开始我的想法是不在原先字符串上操作,新建一个新的字符串作为排序后的字符串,但是这样比较复杂,感觉
    //没有思路进行下去
    //剑指offer上给出的思路:采用递归的方法,并且可以直接在原先的字符串上进行操作
    //1、先选定排序结果字符串第一位置上的字符,方法是分别拿字符串第一个位置上的字符与其它位置上的字符交换位置
    //2、再对第一个位置后面的字符进行排序(又是字符串的排序,递归)。
    
    //递归的出口:如果待排序字符串的长度为1,则递归结束,说明得到了一个字符串的排序
    void Permutation(string &str, size_t begin, vector<string> &strVec){
        if (begin == str.size() - 1){
            strVec.push_back(str);
            return;
        }
        
        for (size_t i = begin; i <= str.size() - 1; i++){
            if (i != begin && str[i] == str[begin]) {
                continue;
            }
            if (str[begin] != str[i]){
                char temp = str[begin];
                str[begin] = str[i];
                str[i] = temp;
            }
            Permutation(str, begin + 1, strVec);
            
            //恢复排序前字符串的状态进行下一轮的排序
            char temp = str[begin];
            str[begin] = str[i];
            str[i] = temp; 
        }
        return;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: