recursive
class Solution {
public List<String> letterCombinations(String digits) {
String[] hash = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
List<String> ans = new ArrayList<>();
if (digits == null || digits.length() == 0) return ans;
dfs(digits, 0, hash, "", ans);
return ans;
}
private void dfs(String digits, int index, String[] hash, String path, List<String> ans){
if (index == digits.length()){
ans.add(path);
return;
}
char cur = digits.charAt(index);
int num = cur - '0';
for (char c : hash[num].toCharArray()){
dfs(digits, index + 1, hash, path + c, ans);
}
}
}
iterative
class Solution {
public List<String> letterCombinations(String digits) {
LinkedList<String> ans = new LinkedList<>();
if (digits == null || digits.length() == 0) return ans;
String[] hash = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.add("");
for (int i = 0; i < digits.length(); i++){
char digit = digits.charAt(i);
int index = digit - '0';
while (ans.peek().length() == i){
String cur = ans.remove();
for (char c : hash[index].toCharArray()){
ans.add(cur + c);
}
}
}
return ans;
}
}