26、字符串的排列

题目描述:

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

解题思路:

  我们可以把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。在下图中,我们用两种不同的背景颜色区分字符串的两部分。

在这里插入图片描述

1. 把字符串分为两部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符(有阴影背景的区域)。

2. 接下来我们求阴影部分的字符串的排列,拿第一个字符和它后面的字符逐个交换

Demo:

class Solution {
public:
    set<string> ans; // 用set去重
    vector<string> Permutation(string str) {
        vector<string> vecout;
        if (str != "")
        {
            fun(str, 0, str.size());
            for (auto tmp : ans)
                vecout.push_back(tmp);
        }
        return vecout;
    }
    void fun(string &str, int start, int len) 
    {
        //当start==arr.length-1时,说明子序列的长度为1,就不用再往下划分子序列了
	    if (start == len)
		    ans.insert(str);
	    for (int i = start; i < len; i++) 
	    {
	    	swap(str[start], str[i]);
	    	fun(str, start + 1, len);
	    	swap(str[start], str[i]);
	    }
    }
};

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/85238061