《剑指offer》面试题38. 字符串的排列

问题描述

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
 

限制:

1 <= s 的长度 <= 8

代码(回溯)

注意使用set为vector去重的技巧:

class Solution {
public:
    vector<string> permutation(string s) {
        vector<string>ans;
        string path;
        vector<bool> flag(s.size(),false);
        backtrack(s,path,ans,flag);
        set<string> st(ans.begin(), ans.end());
        ans.assign(st.begin(), st.end());
        return ans;
    }
    void backtrack(string s,string &path,vector<string>&ans,vector<bool>&flag)
    {
        if(path.size() == s.size())
        {
            ans.push_back(path);
            return;
        }
        for(int i = 0; i < s.size(); ++i)
        {
            if(!flag[i])
            {
                path.push_back(s[i]);
                flag[i] = true;
                backtrack(s,path,ans,flag);
                flag[i] = false;
                path.pop_back();
            }
        }

    }
};

结果:

执行用时 :532 ms, 在所有 C++ 提交中击败了8.06%的用户
内存消耗 :38.6 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

先排序后序不用去重

class Solution {
public:
    vector<string> permutation(string s) {
        vector<string>ans;
        string path;
        vector<bool> flag(s.size(),false);
        sort(s.begin(),s.end());
        backtrack(s,path,ans,flag);
        return ans;
    }
    void backtrack(string s,string &path,vector<string>&ans,vector<bool>&flag)
    {
        if(path.size() == s.size())
        {
            ans.push_back(path);
            return;
        }
        for(int i = 0; i < s.size(); ++i)
        {
            //注意最后这个!flag[i-1]
            if(i > 0 && s[i] == s[i-1] && !flag[i-1])
                continue;
            if(!flag[i])
            {
                path.push_back(s[i]);
                flag[i] = true;
                backtrack(s,path,ans,flag);
                flag[i] = false;
                path.pop_back();
            }
        }

    }
};

结果:

执行用时 :116 ms, 在所有 C++ 提交中击败了59.19%的用户
内存消耗 :18 MB, 在所有 C++ 提交中击败了100.00%的用户

代码(非递归)

结果:

posted @ 2020-04-21 09:36  曲径通霄  阅读(93)  评论(0编辑  收藏  举报