day 24第七章 回溯算法part03 93.复原IP地址 78.子集 90.子集II

任务日期:6.29

目一链接:93. 复原 IP 地址 - 力扣(LeetCode)

思路:利用分割子串的思想递归搜索字符串,比较新的地方在于递归结束条件和回溯时的代码

代码:

class Solution {
public:
    vector<string> result;
//stratindex记录下一层递归搜索的起始位置,pointnum记录点的个数
    void backtracking(string &s,int stratindex,int pointnum) {//int 值得变量不需要加&
        //确定递归终止条件
        if(pointnum == 3) {
            if(isvalid(s,stratindex,s.size() - 1)) result.push_back(s);//isvalid函数里面是下标值
            return;
        }
        //确定当前层递归逻辑
        //截取子串
        for(int i = stratindex;i < s.size();i ++) {//此时区间stratidex到i就是截取区间,判断它是否合法
            if(isvalid(s,stratindex,i)) {
                s.insert(s.begin() + i + 1,'.');//在下标为i + 1的点的前面插入元素
                //pointnum ++;
                backtracking(s,i + 2,++ pointnum);//递归到下一层:此时的下标是i + 2,因为多了一个.
                //回溯:撤销最近的决策所以startindex 不改变
                pointnum --;
                s.erase(s.begin() + 1 + i);//删除s中的.
            } else break;//如果截取的子串不合法,结束当前层
        }
    }

    bool isvalid(string &s,int start,int end) {
        if(start > end) return false;
        if(s[start] == '0' && start != end) return false;//s是字符串
        int num = 0;
        for(int i = start;i <= end;i ++) {
            if(s[i] > '9' || s[i] < '0') return false;
            num = num * 10 + s[i] - '0';
        }
        if(num > 255) return false;
        return true;
    }

    vector<string> restoreIpAddresses(string s) {
        if(s.size() < 4 || s.size() > 12) return result;
        backtracking(s,0,0);
        return result;
    }
};

难点:1.子函数里的变量什么时候加&

2.回溯算法只撤销最近的决策,所以startindex不变




题目二链接:

思路:

代码:

难点:

解释细节1:




题目三链接:

思路:

代码:

难点:

解释细节1:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值