面试题28:字符串排列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okiwilldoit/article/details/78678130

题目:输入一个字符串,输出该字符串中所有字符的排列组合。
如abc,输出:abc acb bac bca cab cba

经典的排列组合问题,思路:
肯定用递归的思想,先固定一个字符,然后再将剩下的字符继续排列组合。
递归函数的参数有三个:原来的字符str,一种组合result,组合集合(输出的结果)result_set
递归函数结束条件是str.size()=0。

从0开始遍历str,将str[i]拼接到result后面,然后得到一个除str[i]字符以外的子串sub_str,对sub_str继续递归。

递归完成后,为什么要删除result中最后一个字符?因为此时result已经是一种组合,删除最后一个字符,继续下一次组合。

代码如下:

void Permutations(string &str, string &result, vector<string> &result_set)
{
    int len = str.size();
    if(len == 0)
    {
        result_set.push_back(result);
        printf("%s\t",result.c_str());
        return;
    }

    for(int i=0; i<len; ++i)
    {
        result += str[i];
        string sub_str;//sub_str是除了字符c以外的子串
        for(int j=0; j<len; ++j)
        {
            if(j != i)
            {
                sub_str += str[j];
            }
        }
        Permutations(sub_str, result, result_set);
        result = result.substr(0, result.size()-1);
    }
}

int main()
{
    string str = "abc";
    string result;
    vector<string> result_set;
    Permutations(str, result, result_set);
    return 0;
}

Leetcode上有类似的题目:
http://blog.csdn.net/okiwilldoit/article/details/20631935

猜你喜欢

转载自blog.csdn.net/okiwilldoit/article/details/78678130