剑指 Offer 38. 字符串的排列

class Solution {List<String> res = new LinkedList();boolean[] visited;public String[] permutation(String s) {if (s == null || s.length() == 0) return new String[0];char[] chars = s.toCharArray();Arrays.sort(chars);visited = new boolean[chars.length];backTrack(chars,new StringBuilder());return res.toArray(new String[res.size()]);}private void backTrack(char[] chars, StringBuilder path) {if (path.length() == chars.length) {res.add(path.toString());return;}for (int i = 0; i < chars.length; i++) {if (visited[i]) continue;if (i > 0 && chars[i] == chars[i - 1] && !visited[i - 1]) continue;visited[i] = true;path.append(chars[i]);backTrack(chars, path);visited[i] = false;path.deleteCharAt(path.length() - 1);}}}
78. 子集

class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new LinkedList();if (nums == null || nums.length == 0) return res;List<Integer> path = new ArrayList();res.add(path);backTrack(nums, res, path, 0);return res;}private void backTrack(int[] nums, List<List<Integer>> res, List<Integer> path , int start) {res.add(new ArrayList(path));for (int i = start; i < nums.length; i++) {path.add(nums[i]);backTrack(nums, res, path, i + 1);path.remove(path.size() - 1);}}}
39. 组合总和

class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res = new LinkedList();if (candidates == null || candidates.length == 0 || target < 1) return res;List<Integer> path = new ArrayList();backTrack(candidates, 0, target, res, path);return res;}private void backTrack(int[] candidates, int start, int target, List<List<Integer>> res, List<Integer> path) {if (target < 0) return;if (target == 0) {res.add(new ArrayList(path));return;}for (int i = start; i < candidates.length; i++) {path.add(candidates[i]);backTrack(candidates, i, target - candidates[i], res, path);path.remove(path.size() - 1);}}}
40. 组合总和 II

class Solution {public List<List<Integer>> combinationSum2(int[] candidates, int target) {List<List<Integer>> res = new LinkedList();if (candidates == null || candidates.length < 1 || target < 1) return res;Arrays.sort(candidates);List<Integer> path = new ArrayList();// boolean[] visited = new boolean[candidates.length];backTrack(candidates, 0, target, path, res);return res;}private void backTrack(int[] nums, int start, int target, List<Integer> path, List<List<Integer>> res) {if (target < 0) return;if (target == 0) {res.add(new ArrayList(path));return;}for (int i = start; i < nums.length; i++) {if (i > start && nums[i] == nums[i - 1]) continue;path.add(nums[i]);backTrack(nums, i + 1, target - nums[i], path, res);path.remove(path.size() - 1);}}}
46. 全排列

class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new LinkedList();
if (nums == null || nums.length == 0) return res;
List<Integer> path = new ArrayList();
boolean[] visited = new boolean[nums.length];
backTrack(nums, path, res, visited);
return res;
}
private void backTrack(int[] nums, List<Integer> path, List<List<Integer>> res, boolean[] visited) {
if (path.size() == nums.length) {
res.add(new ArrayList(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i]) continue;
path.add(nums[i]);
visited[i] = true;
backTrack(nums, path, res, visited);
path.remove(path.size() - 1);
visited[i] = false;
}
}
}
47. 全排列 II

class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new LinkedList();
if (nums == null || nums.length == 0) return res;
List<Integer> path = new ArrayList();
boolean[] visited = new boolean[nums.length];
Arrays.sort(nums);
backTrack(nums, path, res, visited);
return res;
}
private void backTrack(int[] nums, List<Integer> path, List<List<Integer>> res, boolean[] visited) {
if (path.size() == nums.length) {
res.add(new ArrayList(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i]) continue;
if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) continue;
path.add(nums[i]);
visited[i] = true;
backTrack(nums, path, res, visited);
path.remove(path.size() - 1);
visited[i] = false;
}
}
}
17. 电话号码的字母组合

class Solution {
Map<Character,String> dict;
public List<String> letterCombinations(String digits) {
dict = new HashMap(){{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
List<String> res = new LinkedList();
if (digits == null || digits.length() == 0) return res;
StringBuilder path = new StringBuilder();
backTracking(digits, 0, path, res);
return res;
}
private void backTracking(String digits, int start, StringBuilder path, List<String> res) {
if (start == digits.length()) {
res.add(path.toString());
return;
}
String letters = dict.get(digits.charAt(start));
for (char c : letters.toCharArray()) {
path.append(c);
backTracking(digits, start + 1, path, res);
path.deleteCharAt(path.length() - 1);
}
}
}
将上面的map优化成数组
class Solution {
String[] dict = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
List<String> res = new LinkedList();
if (digits == null || digits.length() == 0) return res;
StringBuilder path = new StringBuilder();
backTracking(digits, 0, path, res);
return res;
}
private void backTracking(String digits, int start, StringBuilder path, List<String> res) {
if (start == digits.length()) {
res.add(path.toString());
return;
}
String letters = dict[digits.charAt(start) - '2'];
for (char c : letters.toCharArray()) {
path.append(c);
backTracking(digits, start + 1, path, res);
path.deleteCharAt(path.length() - 1);
}
}
}
