剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列

题目

原题传送门
20201119192143-2020-11-19-19-21-44

题解

解题思路

dfs 正常搜索就行了。
排序的话例如。用数字模拟代表字符。排序后结果为。
1 2 2 2 3
当我没有选择 第一 2 数字时,第二 次出现 2 我也不能进行选择。不然的话。
情况一
假设我选择1 然后选择 第1个2 目前得到的序列是。
1 2 。。。
情况二
假设我选择1 然后选择 第2个2 目前得到的序列是。
1 2 。。。
这样的话情况一情况二会生成相同的排列情况。
如果我要求 如果上一个值和当前值相同,并且是没有选择的,那么当前值也不应该选择。(去除重复的策略)
那么在这种情况下。
如果我第一次出现的2 没有选择,
那么下一次就应该应该判断的3 是否选择,而不应该继续往下判断 后面的 2 是否选择。
情况三 如果选择3的话,这样就不会造成重复。
1 3 。。。

代码

class Solution {
public:
    string tmp;
    void dfs(vector<string> & ans, string & s, vector<bool> flag) {
        if (s.size() == tmp.size()) {
            ans.push_back(tmp);
            return;
        }
        for (int i = 0; i < s.size(); i ++ ) {
            // 去除重复的情况。 如果上一个值和当前值相同,但是没有选择,那么当前值也不应该选择。
            if (i > 0 && !flag[i - 1] && s[i - 1] == s[i]) continue; 
            // 正常情况。
            if (!flag[i]) {
                string t = tmp;
                tmp += s[i];
                flag[i] = true;
                dfs(ans, s, flag);
                // 恢复现场。
                flag[i] = false;
                tmp = t;
            }
        }
    }
    vector<string> permutation(string s) {
        if (!s.size()) return {};
        vector<string> ans;
        // 排序便于去除重复。
        sort(s.begin(), s.end());

        vector<bool> flag(s.size(), false);
        dfs(ans, s, flag);
        return ans;
    }
};

喜欢的话,给博主赏一杯冰阔乐吧~~


 上一篇
23种设计模式(必考点) 23种设计模式(必考点)
总结软件工程课,老师用的ppt中的设计模式。
2020-11-21
下一篇 
剑指 Offer 65. 不用加减乘除做加法 剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法题目 题意 就是不让用加减乘除等运算来模拟实现加法运算。 题解 异或找到不需要进位的情况。 相与找到需要进位的情况。然后左移一位模拟进位。 不停循环直到进位的值为零时,即两数异或就是两个数的
2020-11-18
  目录