当前位置: 首页 > backend >正文

回溯算法学习

一、电话号码的字母组合

import java.util.ArrayList;
import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD= {"",  //0"",  //1"abc", //2"def","ghi","jkl","mno","pqrs","tuv","wxyz"		};
public List<String> letterCombinations(String digits) {
List<String>result=new ArrayList<>();
if(digits==null||digits.isEmpty()) {return result;
}
backtrack(digits,0,new StringBuilder(),result);
return result;}
private void backtrack(String digits, int index, StringBuilder path, List<String> result) {// TODO Auto-generated method stub//当路径长度等于数字串长度,加入到结果列表if(path.length()==digits.length()) {result.add(path.toString());return;}//获取当前数字对应的字母集char digit=digits.charAt(index);String letterString =KEYPAD[digit-'0'];//遍历字母集,递归处理下一个数字for(char c:letterString.toCharArray()) {path.append(c);backtrack(digits, index+1, path, result);//回溯,删除最后添加的字符path.deleteCharAt(path.length()-1);}
}
}

 String letterString=Keypad[digit-'0'];

在Java里,字符类型(char)本质上是整数类型,它存储的是字符对应的Unicode码点值。数字字符‘0’到‘9’的Unicode码点是连续的,其范围是从48(对应字符‘0’)到57(对应字符‘9’)。

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class CombinationSum {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();// 排序,方便剪枝Arrays.sort(candidates); backtrack(candidates, target, 0, path, result);return result;}private void backtrack(int[] candidates, int remain, int start, List<Integer> path, List<List<Integer>> result) {if (remain == 0) {// 找到符合条件的组合,加入结果集(注意要 new 新的 ArrayList 避免引用问题)result.add(new ArrayList<>(path)); return;}for (int i = start; i < candidates.length; i++) {if (candidates[i] > remain) {// 当前元素已超过剩余目标和,由于数组有序,后续元素更大,直接剪枝break; }// 选择当前元素path.add(candidates[i]); // 递归,可重复选当前元素,所以 start 还是 ibacktrack(candidates, remain - candidates[i], i, path, result); // 撤销选择,回溯path.remove(path.size() - 1); }}public static void main(String[] args) {CombinationSum solution = new CombinationSum();int[] candidates = {2, 3, 6, 7};int target = 7;List<List<Integer>> result = solution.combinationSum(candidates, target);for (List<Integer> list : result) {System.out.println(list);}}
}
  • 排序与剪枝:对 candidates 排序后,当 candidates[i] > remain 时,后续元素必然也大于 remain,直接 break 可减少递归次数,提升效率。
  • 回溯逻辑path 记录当前组合,递归时通过 remain - candidates[i] 更新剩余目标和,start 保持为 i 实现元素可重复选取;递归返回后 path.remove 撤销选择,继续尝试其他分支。
  • 结果收集:当 remain == 0 时,将 path 复制到新的 ArrayList 再加入 result,避免后续 path 变化影响已加入结果。

http://www.xdnf.cn/news/13143.html

相关文章:

  • PCIe-8622工业级网卡特性解析
  • Linux中《基础IO》详细介绍
  • leetcode刷题经验
  • 云安全与网络安全:核心区别与协同作用解析
  • 统计学(第8版)——统计抽样学习笔记(考试用)
  • 使用 Python 正则表达式实现文本替换与电话号码规范化
  • 位运算求最大值的子集数目问题
  • Ace网络验证软件卡密系统-免费免搭建 记录整理
  • 如何让非 TCP/IP 协议驱动屏蔽 IPv4/IPv6 和 ARP 报文?
  • 搭建仿真yolo环境
  • Docker安装、基础知识、项目部署笔记
  • Ubuntu里面单独编译某一个模块
  • iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享
  • nacos开启鉴权密码登录
  • FFmpeg:Windows系统小白安装及其使用
  • R语言速释制剂QBD解决方案之三
  • 曼昆《经济学原理》第九版 第十一章公共物品与公共资源
  • WDK 10.0.19041.685,可在32位win7 sp1系统下搭配vs2019使用,可以编译出xp驱动。
  • 深度剖析OpenSSL心脏滴血漏洞与Struts2远程命令执行漏洞
  • DAP-seq测序(DNA亲和纯化测序)!
  • Python爬虫实战:研究Restkit库相关技术
  • 芯科科技Tech Talks技术培训重磅回归:赋能物联网创新,共筑智能互联未来
  • 在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
  • Python爬虫实战:研究feedparser库相关技术
  • MySQL中text,longtext,mediumtext区别
  • 数组合并方式
  • 深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
  • [C#]基于winform部署PP-OCRv5的推理模型paddleocrv5模型部署
  • 算法:模拟
  • 网格三面角,散射过程推导