17. 电话号码的字母组合
深度优先搜索
import java.util.ArrayList;
import java.util.List;
class Solution {
/**
* 全局变量存储结果
*/
List<String> list = new ArrayList<>();
/**
* 哈希表存储数字和字母的对应关系
*/
String[] strs = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
if (digits.length() == 0){
return list;
}
dfs(digits, 0, "");
return list;
}
/**
* 从第一个数字开始,依次遍历
* 将每个字符串中的字母都递归的放在下一个数字代表的字符串的前面
*/
public void dfs(String digits, int index, String str){
if (index == digits.length()){
list.add(str);
return;
}
String s = strs[digits.charAt(index) - '0'];
for (int i = 0; i < s.length(); i++) {
dfs(digits, index + 1, str + s.charAt(i));
}
}
}
/**
* 时间复杂度 O(2^n)
* 空间复杂度 O(n)
*/
回溯(空间复杂度减小)
import java.util.LinkedList;
import java.util.List;
class Solution {
/**
* 哈希表存储数字和字母的对应关系
*/
String[] strs = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
/**
* 全局变量存储结果
* 使用StringBuilder可变字符串
*/
List<String> list = new LinkedList<>();
StringBuilder str = new StringBuilder();
public List<String> letterCombinations(String digits) {
if (digits.length() == 0){
return list;
}
backtracking(digits, 0);
return list;
}
public void backtracking(String digits, int startIndex){
if (startIndex == digits.length()){
list.add(str.toString());
return;
}
/**
* 回溯
* 先取出数字代表的字符串,对这个字符串进行循环
* 每次加入当前数字的一个字母,递归后再删除这个字母,换下一个字母继续
*/
String s = strs[digits.charAt(startIndex) - '0'];
for (int i = 0; i < s.length(); i++) {
str.append(s.charAt(i));
backtracking(digits, startIndex + 1);
str.deleteCharAt(str.length() - 1);
}
}
}
/**
* 时间复杂度 O(2^n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/