刚看到题其实稍微有点蒙,不过看了题目配的图就很简单了。
图里已经给出了一种解题思路。按顺序遍历遍历字符串,对每一个字符都调换它以及大于等于它的下标的字符,将新得到的字符串压栈,并对新字符串也执行该操作,直到遍历完整个字符串。
由于调用的层数比较深,这里选择递归的方法来实现。传入参数中的index为开始交换的下标。
第一次写完代码测试时,发现"aab"的调用结果会出现6个,其中有三个重复的,所以正确结果应该是3个。为了解决重复元素造成的重复结果这一问题,选择先将得到的数组变为集合,再将集合变回数组的方式解决。

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.length() == 1){
            result.push_back(str);
            return result;
        }
        arrange(result, str, 0);
        set<string> s(result.begin(),result.end());
        vector<string> nr(s.begin(),s.end());
        return nr;
    }
    void arrange(vector<string> &result, string str, int index){
        if(index == str.length() - 1){
            return;
        }
        for(int i = index;i < str.length();i++){
            string cp = str;
            char temp = cp[index];
            cp[index] = str[i];
            cp[i] = temp;
            result.push_back(cp);
            arrange(result, cp, index + 1);
        }
    }
};