sadads
sadads
sadads
//“回溯法”+dfs,我们要找出所有的排列,所以要用到“回溯法”思想,相应的用dfs
class Solution {
public List<List<Integer>> permute(int[] nums) {
//数组的长度
int len = nums.length;
//返回的集合
List<List<Integer>> rt_list = new ArrayList<>();
//数组的长度判断不需要了,因为提示中给出了长度>=0 if(len == 0) return rt_list;
//创建数组
List<Integer> list = new LinkedList<>();
//是否使用
boolean[] isUsed = new boolean[len];
//进行回溯+dfs
dfs(rt_list , list , 0 , len , nums , isUsed);
return rt_list;
}
/**
@ List<List<Integer>> rt_list 表示要返回的集合
@ List<Integer> list 表示一个一个的集合
@ int index 表示遍历到当前的索引
@ int len 表示数组的长度
@ int[] nums 表示数组
@ boolean[] isUsed 表示当前数组的对应索引位置是否使用
*/
private void dfs(List<List<Integer>> rt_list , List<Integer> list , int index , int len , int[] nums , boolean[] isUsed){
if(index == len){
rt_list.add(new LinkedList<Integer>(list));
return;
}
for(int i=0 ; i<len ; i++){
if( !isUsed[i] ){
list.add(nums[i]);
isUsed[i] = true;
//接着遍历
dfs(rt_list , list, index+1 , len , nums , isUsed);
//回溯
isUsed[i] = false;
list.remove(list.size()-1);
}
}
}
}
sadads
//先把数字对应的键值一一对应,这样用hashmap比较好,然后对应找值。
//回溯是最起初的方法
class Solution {
public List<String> letterCombinations(String digits) {
//数组的长度
int len = digits.length();
//返回的集合
List<String> rt_list = new ArrayList<>();
//如果长度为0,返回
if(len == 0)
return rt_list;
//哈希表一一对应电话号码
Map<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");
//进行回溯
reback(digits , rt_list , 0 , len , new StringBuffer() , map);
//返回
return rt_list;
}
private void reback(String digits , List<String> rt_list , int index , int len , StringBuffer string_way , Map<Character , String> map){
if(index == len){
rt_list.add(string_way.toString());
return;
}
//当前字符串索引下的字符
Character curCharacter = digits.charAt(index);
//获取当前字母下的值
String curString = map.get(curCharacter);
//curString是相应数字对应的几个值,curCharacter对应的字母
for(int i=0 ; i<curString.length() ; i++){
string_way.append(curString.charAt(i));
reback(digits , rt_list , index+1 , len , string_way , map);
//回溯的时候要删除标记
string_way.deleteCharAt(index);
}
}
}