描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

示例1

输入:

"ab"

返回值:

["ab","ba"]

 思路:这题考虑将原问题分解成两个子问题,即把一个字符串看成是两个部分组成,第一部分为第一个字符,第二部分为第一个字符后面的所有字符。对于整个字符串的排列,可以分为两步来进行,第一步求出所有可能出现在第一个位置的字符,也就是把第一个字符分别和后面的每一个字符进行交换,然后第二步就是固定第一个字符,求后面的所有字符,同样把后面的字符分为两部分来进行,原理和前面计算的一样,这样就是分解成了不同规模的子问题,解决办法是一样的,就可以尝试用递归的方式去解决。

具体的过程如下:

(1)abc->bac->cba, a分别和后面的每一个字符进行交换;

(2)对于bc,再采用前面的方式进行处理,bc->cb 即原来字符串变为abc->acb。

代码如下:

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.size() == 0) return result;
        permutation(str, result, 0);
        return result;
    }
    void permutation(string str, vector<string> &result, int begin)
    {
        if(begin == str.size()-1)
        {
            result.push_back(str);
        }
        else
        {
            for(int i = begin; i < str.size(); i++)
            {
                if(i != begin && str[i] == str[begin])
                    continue;
                swap(str[i], str[begin]);
                permutation(str, result, begin+1);
            }
        }
    } 
};