算法通关村第18关【黄金】| 继续回溯

1.复原IP地址

思路:

单层for循环start控制开始位置,逐个遍历情况取,附带剪枝,递归返回后进行point回溯

深度递归pointNum三层,确定终止条件

java 复制代码
class Solution {
    List<String> result = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length()>12){
            return result;
        }
        trace(s,0,0);
        return result;
    }
    
    public void trace(String s,int start,int pointNum){
        if(pointNum == 3){
            if (isValid(s,start,s.length()-1)) {
                result.add(s);
            }
            return;
        }
        for(int i = start;i<s.length();i++){
            if(isValid(s,start,i)){
                pointNum++;
                s = s.substring(0,i+1) + "." + s.substring(i+1);
                trace(s,i+2,pointNum);
                pointNum--;// 回溯
                s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
            }else{
                break;
            }
        }


    }

    private Boolean isValid(String s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
            return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
                return false;
            }
            num = num * 10 + (s.charAt(i) - '0');
            if (num > 255) { // 如果⼤于255了不合法
                return false;
            }
        }
        return true;
    }
}

2.电话号码的字母组合

思路:回溯模板

层的选择元素为c[num],for(int i = 0;i<c[num-2].length;i++),组合不需要剪枝

深度为digits的长度,确定终止条件

java 复制代码
class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<String>();
        if(digits.length() == 0){
            return list;
        }
        char[][] c = {
            {'a','b','c'},
            {'d','e','f'},
            {'g','h','i'},
            {'j','k','l'},
            {'m','n','o'},
            {'p','q','r','s'},
            {'t','u','v'},
            {'w','x','y','z'}
        };
        int len = digits.length();
        char[] s = new char[len];
        trace(c,s,list,0,digits);
        return list;

    }
    public void trace(char[][] c,char[] s,List list,int cur,String digits){
        if(cur == s.length){
            list.add(new String(s));
            return;
        }
        int num = digits.charAt(cur) - '0';
        for(int i = 0;i<c[num-2].length;i++){
            num = digits.charAt(cur) - '0';
            s[cur] = c[num-2][i];
            trace(c,s,list,cur+1,digits);

        }
    }
}

3.括号生成

思路:回溯

层的选择元素有两个 '(' ,')',但是不能瞎选需要满足题目要求也就是要进行剪枝

  • 剩余左括号数量要小于等于右括号数量
  • 剩余的括号数量要大于0

由深度也就是n*2总共长度,确定终止条件

java 复制代码
class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        char[] s = new char[n*2];
        trace(n,n,s,list,0);
        return list;
    }

    public void trace(int left,int rigth,char[] s,List list,int cur){
        if(left == 0 && rigth == 0){
            list.add(new String(s));
            return;
        }
        if(left-1>=0&&left-1<=rigth){
            s[cur] = '(';
            trace(left-1,rigth,s,list,cur+1);
        }
        if(rigth-1>=0&&left<=rigth-1){
            s[cur] = ')';
            trace(left,rigth-1,s,list,cur+1);
        }
    }
}
相关推荐
聚客AI14 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v17 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工19 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农20 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了21 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo21 小时前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法