• 代码随想录算法训练营第二十八天|LeetCode93 复原IP地址、LeetCode78 子集


    题1:

    指路:LeetCode93 复原IP地址
    思路与代码:

    对于这种暴搜出不来的就该用回溯了。对于一个合理的IP地址:有四个字串,每个字串的值的和在[0, 255]中即可(注意不可有前导0)。所以我们用一个计数器pointSum为给定字符串中分割字串的分隔符'.'计数。每当有一个合理的子串时在该子串后面增加一个分隔符,当pointSum等于3时该字符串合理。

    1. class Solution {
    2. private:
    3. vector result;
    4. void backtracking(string& s, int startIndex, int pointSum) {
    5. // pointSum 是IP地址中合理分割的分隔符
    6. if (pointSum == 3) { // 三个分隔符四个部分是正常的IP地址
    7. if (isValid(s, startIndex, s.size() - 1)) // 判断区间为左闭右闭
    8. {
    9. result.push_back(s); // 放入结果集
    10. }
    11. return ;
    12. }
    13. for (int i = startIndex; i < s.size(); i++) {
    14. // 单层循环逻辑
    15. if (isValid(s, startIndex, i)) {
    16. s.insert(s.begin() + i + 1, '.'); // 在合理的字符后面加分隔符
    17. pointSum += 1;
    18. backtracking(s, i + 2, pointSum); // +2是因为统计分隔符后面的子串
    19. s.erase(s.begin() + i + 1); // 回溯1:删除分隔符
    20. pointSum -= 1; // 回溯2:统计器-1复原
    21. }
    22. else break;
    23. }
    24. }
    25. // 判断子串是否在[0, 255]范围内
    26. bool isValid(const string& s, int begin, int end) {
    27. if (begin > end) return false;
    28. if (s[begin] == '0' && begin != end) return false;
    29. // 有前导0不合法
    30. int num = 0;
    31. for (int i = begin; i <= end; i++) {
    32. if (s[i] > '9' || s[i] < '0') return false;
    33. num = num * 10 + (s[i] - '0');
    34. if (num > 255) return false;
    35. }
    36. return true;
    37. }
    38. public:
    39. vector restoreIpAddresses(string s) {
    40. backtracking(s, 0, 0);
    41. return result;
    42. }
    43. };

    emm……蛮有难度的一个题。题意很好懂,思路也容易理,但是不大好写,我改了蛮久。

    题2:

    指路:LeetCode78 子集
    思路与代码:

    标标准准的回溯题,类似于之前的组合。遇到合理的路径加入最终结果集,回溯弹出即可。代码如下:

    1. class Solution {
    2. private:
    3. vectorint>> result;
    4. vector<int> path;
    5. void backtracking(vector<int>& s, int startIndex) {
    6. result.push_back(path);
    7. if (path.size() > s.size()) return ;
    8. for (int i = startIndex; i < s.size(); i++) {
    9. path.push_back(s[i]);
    10. backtracking(s, i + 1);
    11. path.pop_back();
    12. }
    13. }
    14. public:
    15. vectorint>> subsets(vector<int>& nums) {
    16. backtracking(nums, 0);
    17. return result;
    18. }
    19. };

  • 相关阅读:
    CTF网络安全大赛详情
    vue3搭建Arco design UI框架
    【更新】上市公司“宽带中国”战略数据集(2000-2022年)
    设计模式之:享元模式FlyweightPattern的实现
    创建UI账号密码登录界面
    如何使用Pyarmor保护你的Python脚本
    不知道显卡选择GeForce和Quadro哪个更好?超全科普来看
    SQL面试题
    自制肥鲨HDO2电源升压延长线
    Puppeteer基础知识(一)
  • 原文地址:https://blog.csdn.net/m0_74174715/article/details/139453927