剑指38题解 | #字符串的排列#

字符串的排列

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

#include <vector>
class Solution {
public:
    // vector<string> sum;
    // void find(string& s, int& id, string& v, vector<int>& vis)
    // {
    //     v+=s[id];
    //     if(id == s.size()-1){
    //         sum.push_back(v);
    //         return;
    //     }
    //     for(int i = id; i < s.size(); ++i)
    //     {
    //         swap(s[id], s[i]);
    //         id +=1;
    //         find(s,id, v, vis);
    //     }
    // }
    vector<string> Permutation(string str) {
        // write code here
        //  写的有问题的递归做法
        // if (str.empty()) {
        //     return sum;
        // }
        // int i = 0;
        // string v;
        // vector<int> vis(str.size(), 0); // 记录遍历过情况
        // find(str, i, v, vis);
        // return sum;

        // // 方法1:偷懒解法,next_permutation全排列接口
        // vector<string> v;
        // sort(str.begin(), str.end());
        // do{
        //     v.push_back(str);
        // }while (next_permutation(str.begin(),str.end())); 
        // return v;

        // 方法2:用过一个剔除一个做法
        set<string> res;
        string s;
        find(res, str, s);
        vector<string> v(res.begin(), res.end());
        return v;
    }
    // 全排序能想到这种方法,脑瓜子真好
    void find(set<string>& res, string str, string s){
        if (str.empty()) res.insert(s);
        for(int i = 0; i < str.size(); ++i) // 每一个位置都有可能剔除
        {
            string tmp = str;
            find(res, tmp.erase(i,1), s+str[i]);// 用过的剔除,剔除的保存在新的组合字符串里面
        }
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

犹豫的小狐狸刷了100道题:你是我在牛课上见到的最漂亮的女孩了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务