一、返回值问题
- 如果DFS用于搜索的话,所以用一个变量保存每一步结果,在每一次递归到底后输出,所以一般回溯算法和DFS的方法不需要返回值。
- 回溯法或纯递归求单个值需要每一层递归的子问题的返回值回溯成最终的解
上面是有返回值写法,下面是没有返回值写法
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
String digits = "23";
for (String l : letterCombinations(digits)) {
System.out.print(l);
System.out.println();
}
}
public static List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
StringBuffer sb = new StringBuffer();
letter_Combinations(digits, res, sb);
res.remove("");
return res;
}
public static void letter_Combinations(String digits, List res, StringBuffer sb) {
if (digits.length() == 0) {
res.add(sb.toString());
} else {
String[] s = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
char[] c = digits.toCharArray();
String a = s[Character.getNumericValue(c[0]) - 2];
for (int i = 0; i < a.length(); i++) {
sb.append(a.charAt(i));
letter_Combinations(digits.substring(1), res, sb);
sb.deleteCharAt(sb.lastIndexOf(String.valueOf(a.charAt(i))));
}
}
}
}
二、return放哪的问题
leetcode #17. 电话号码的字母组合
1. 放for循环后面
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
String digits = "23";
List<String> res = new ArrayList<>();
letterCombinations(digits, res);
}
public static List<String> letterCombinations(String digits, List res) {
if (digits.isEmpty()) {
for (Object l : res) {
System.out.print(l);
}
System.out.println();
return res;
}
String[] s = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
char[] c = digits.toCharArray();
String a = s[Character.getNumericValue(c[0]) - 2];
for (int i = 0; i <= 2; i++) {
res.add(String.valueOf(a.charAt(i)));
letterCombinations(digits.substring(1), res);
res.remove(String.valueOf(a.charAt(i)));
}
return res;
}
}
/*输出结果
ad
ae
af
bd
be
bf
cd
ce
cf
*/
2.放for循环里
for (int i = 0; i <= 2; i++) {
res.add(String.valueOf(a.charAt(i)));
letterCombinations(digits.substring(1), res);
res.remove(String.valueOf(a.charAt(i)));
return res;
}
/*
ad
*/