剑指offer——面试题28:字符串的排列

剑指offer——面试题28:字符串的排列

Solution1:
2018年9月2日重做
典型的DFS套路,LeetCode 46 && 47
【46】https://blog.csdn.net/Allenlzcoder/article/details/80271771
【47】https://blog.csdn.net/Allenlzcoder/article/details/80275707,
重写一下:

class Solution {
public:
    vector<string> Permutation(string str) {
        if (!str.size()) return {};
        if (str.size() == 1) return vector<string> {str};
        set<string> tmp_res;
        //未访问过 0; 访问过 1
        vector<int> visited(str.size(), 0);
        int level = 0;
        string tmp_str;
        my_dfs(str, tmp_res, tmp_str, visited, level);
        return vector<string> (tmp_res.begin(), tmp_res.end());
    }

    void my_dfs(string &str, set<string> &tmp_res, 
                string &tmp_str, vector<int> &visited, int level) {
        if (level == str.size()) {
            tmp_res.insert(tmp_str);
            return;
        } else {
            for (int i = 0; i < str.size(); i++) {
                if (visited[i]) continue;
                else {
                    tmp_str += str[i];
                    visited[i] = 1;
                    my_dfs(str, tmp_res, tmp_str, visited, level + 1);
                    tmp_str.pop_back();
                    visited[i] = 0;
                }
            }
        }
    }
};

Soltion2:
第一次做题时的答案
发现了一个代码风格很清新的博客,网址是:http://www.cnblogs.com/qqky/
此题答案就是根据此博客整理而来~

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> res;
        if(str.empty())
            return res;
        FindAll(str, 0, res);
        sort(res.begin(),res.end());
        return res;
    }

    void FindAll(string s, int begin, vector<string> &result){ //遍历第begin位的所有可能
        //一次遍历的结束条件
        if(begin == s.size()-1)
            result.push_back(s);
        for(int i = begin; iif(i!=begin && s[i] == s[begin])
                continue;//有与begin位重复的字符串不进行交换,跳过

            swap(s[i],s[begin]);

            //当i==begin时,也要遍历其后面的所有字符
            //当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符
            FindAll(s,begin+1,result);
            swap(s[i],s[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
        }
        return;
    }
};

你可能感兴趣的:(剑指offer题目笔记)