46.全排列
全排列題目鏈接
List<List<Integer>> results;
boolean [] flags ;
public List<List<Integer>> permute(int[] nums) {
results = new ArrayList<>();
List<Integer> list = new ArrayList<>();
if(nums==null||nums.length==0){
results.add(list);
return results;
}
list.add(0);
flags = new boolean[nums.length];
dfs(list,nums,0);
return results;
}
public void dfs(List<Integer> list,int [] nums,int cur){
if(cur>nums.length){
return;
}
if(cur==nums.length){
results.add(new ArrayList<>(list));
return;
}
for(int i=0;i<nums.length;i++){
if(!flags[i]){
flags[i]=true;
list.add(nums[i]);
dfs(list,nums,cur+1);
flags[i]=false;
list.remove(list.size()-1);
}
}
}
47.全排列 II
全排列題目鏈接
- 和上一道幾乎一樣的思路,dfs模板,就加個條件,可以用一個map來存儲順序
List<List<Integer>> results = new ArrayList<>();
boolean [] flags;
Map<String,Boolean> map;
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> list = new ArrayList<>();
if(nums==null||nums.length==0){
results.add(list);
return results;
}
flags=new boolean[nums.length];
map = new HashMap<>();
dfs(nums,list,0);
return results;
}
public void dfs(int [] nums,List<Integer> list,int cur){
if(cur>nums.length){
return;
}
if(cur==nums.length){
StringBuilder stringBuilder = new StringBuilder();
list.forEach(li->{
stringBuilder.append(li);
});
if(map.containsKey(stringBuilder.toString())){
return;
}
map.put(stringBuilder.toString(),true);
results.add(new ArrayList<>(list));
return;
}
for(int i=0;i<nums.length;i++){
if(!flags[i]){
flags[i]=true;
list.add(nums[i]);
dfs(nums,list,cur+1);
list.remove(list.size()-1);
flags[i]=false;
}
}
}
49.字母異位詞分組
字母異位詞分組題目鏈接
- 循環每個字符串,用字符串拼接a-z出現的次數,而這個字符串映射一個下標,思路很清晰就可以解決了!
List<List<String>> results;
Map<String,Integer> map;
public List<List<String>> groupAnagrams(String[] strs) {
results = new ArrayList<>();
map = new HashMap<>();
if(strs==null||strs.length==0){
return results;
}
int count = 0;
for(int i=0;i<strs.length;i++){
String str = strs[i];
int num = 0;
int [] zimu = new int[26];
for(int j=0;j<str.length();j++){
char s = str.charAt(j);
zimu[s-97]++;
}
StringBuilder stringBuilder = new StringBuilder();
for(int j=0;j<26;j++){
stringBuilder.append(zimu[j]);
}
if(map.containsKey(stringBuilder.toString())){
int index=map.get(stringBuilder.toString());
results.get(index).add(strs[i]);
}
else{
map.put(stringBuilder.toString(),count++);
List<String> list = new ArrayList<>();
list.add(strs[i]);
results.add(list);
}
}
return results;
}