leetcode刷题之回溯法
Posted Panda_Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题之回溯法相关的知识,希望对你有一定的参考价值。
leetcode17 电话号码的字母组合
class Solution {
public List<String> letterCombinations(String digits) {
HashMap<Character,String> map = new HashMap<>();
map.put('2',"abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");
List<String> res = new ArrayList<>();
if(digits == null || digits.length() == 0)
return res;
StringBuilder cur = new StringBuilder();
// 字符串拼接 StringBuilder(没有涉及多线程安全问题) StringBuffer
backtracking(digits,map,0,res,cur);
return res;
}
// 不需要返回结果集
private void backtracking(String digits, HashMap<Character,String> map, int index, List<String> res, StringBuilder str){ //遍历字符串digits每个位置 start表示当前索引位置 每一个组合用StringBuilder来装
if(index == digits.length())
res.add(str.toString());
else{
String s = map.get(digits.charAt(index));
int count = s.length();
for(int i = 0; i <count; i++){
str.append(s.charAt(i));
backtracking(digits,map,index+1,res,str);
//str.remove(str.length()-1);
str.deleteCharAt(index);
}
}
}
}
leetcode78 子集
class Solution {
public List<List<Integer>> subsets(int[] nums) {
//回溯法
List<Integer> list = new LinkedList<>();
List<List<Integer>> ans = new LinkedList<>();
ans.add(list);
for(int i = 1; i <= nums.length; i++){
backTracking(nums,i,0,ans,new LinkedList<>());
}
return ans;
}
private void backTracking(int[] nums, int length, int index, List<List<Integer>> ans, List<Integer> subset){
if(subset.size() == length){
List<Integer> temp = new LinkedList<>(subset);
ans.add(temp);
return;
}
for(int i = index; i < nums.length; i++){
subset.add(nums[i]);
backTracking(nums,length,i+1,ans,subset);
subset.remove(subset.size()-1);
}
}
}
以上是关于leetcode刷题之回溯法的主要内容,如果未能解决你的问题,请参考以下文章