day28 | 回溯part4

93. 复原 IP 地址

分成四份

class Solution {
public:
    // 将字符串分割成4份,每份都是0~255,数字不能含有前导零
    vector<string> res;
    string s;
    vector<string> restoreIpAddresses(string s) {
        this->s = s;
        vector<string> vec;
        dfs(vec, 0);
        return res;
    }

    // tmp划分数组, u下标
    void dfs(vector<string>& tmp, int u)
    {
        if (tmp.size() > 4) return;
        if (u == s.size() && tmp.size() == 4)
        {
            string t;
            for (const auto &it : tmp)
                t += it + ".";
            t.pop_back();
            res.push_back(t);
            return;
        }

        // u是还没选
        for (int i = u; i < s.size(); i ++)
        {
            string t = s.substr(u, i - u + 1);
            if (check(t))
            {
                tmp.push_back(t);
                dfs(tmp, i + 1);
                tmp.pop_back();
            }
            else
                break;
        }
    }

    // 0~255,数字不能含有前导零
    bool check(string s)
    {
        if (s.size() > 1 && s[0] == '0') return false;
        int num = stoi(s);
        if (num > 255) return false;
        return true;
    }
};

78. 子集

加答案有了种新的写法,原来是两个dfs,长度到了就加下答案。

可以只要一个dfs【选】,每次开始都加答案

class Solution {
public:
    vector<int> nums;
    vector<vector<int>> res;
    vector<vector<int>> subsets(vector<int>& nums) {
        this->nums = nums;
        vector<int> tmp;
        dfs(tmp, 0);
        return res;
    }

    void dfs(vector<int>& tmp, int u)
    {
        res.push_back(tmp);
        for (int i = u; i < nums.size(); i ++)
        {
            tmp.push_back(nums[i]);
            dfs(tmp, i + 1);
            tmp.pop_back();
        }
    }
};

90. 子集 II

主打一个去重,和第 40 题一个思路,循环那里玩出花

class Solution {
public:
    // sort之后  和前面的比较, 去重
    vector<vector<int>> res;
    vector<int> nums;
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        this->nums = nums;
        vector<int> vec;
        dfs(vec, 0);
        return res;
    }

    // 需要去重
    void dfs(vector<int>& vec, int u)
    {
        res.push_back(vec); // 当前下标u,后面都不选也是一种情况
        // 这里的 i 是会产生距离的
        for (int i = u; i < nums.size(); i ++)
        {
            if (i > u && nums[i] == nums[i-1]) continue;
            vec.push_back(nums[i]);
            dfs(vec, i + 1);
            vec.pop_back();
        }
    }
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇