function backtrack(n, used){// 判断输入或者状态是否非法if(input/state is invalid){return;}// 判读递归是否应当结束,满足结束条件就返回结果if(match condition){return some value;}// 遍历当前所有可能出现的情况,并尝试每一种情况for(all possible cases){// 如果上一步尝试会影响下一步尝试,需要写入状态
used.push(case)// 递归进行下一步尝试,搜索该子树
result =backtrack(n +1, used)// 在这种情况下已经尝试完毕,重置状态,以便于下面的回溯尝试
used.pop(case)}}
经典问题
leetcode17. 电话号码的字母组合
classSolution{private List<String> res =newArrayList<>();privatefinal String[] letterMap =newString[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};public List<String>letterCombinations(String digits){if(digits.length()==0){return res;}findCombination(digits,0,"");return res;}privatevoidfindCombination(String digits,int index, String s){if(index == digits.length()){
res.add(s);return;}
Character c = digits.charAt(index);
String letters = letterMap[c -'0'];for(int i =0; i < letters.length(); i ++){findCombination(digits, index+1, s + letters.charAt(i));}return;}}
leetcode46. 全排列
publicclassSolution{private List<List<Integer>> res =newArrayList<>();public List<List<Integer>>permute(int[] nums){if(nums.length ==0){return res;}boolean[] used =newboolean[nums.length];
List<Integer> list =newArrayList<>();backtrack(nums,0, list, used);return res;}publicvoidbacktrack(int[] nums,int index, List<Integer> list,boolean[] used){if(index == nums.length){
res.add(newArrayList<>(list));return;}for(int i =0; i < nums.length; i++){if(!used[i]){
list.add(nums[i]);
used[i]=true;backtrack(nums, index +1, list, used);
list.remove(list.size()-1);
used[i]=false;}}}}