import java.util.Hashtable;
class Solution {
public List<String> letterCombinations(String digits) {
ArrayDeque<String> res = new ArrayDeque<>();
res.add("");
Hashtable<Integer, String> ht = new Hashtable<>();
ht.put(2, "abc");
ht.put(3, "def");
ht.put(4, "ghi");
ht.put(5, "jkl");
ht.put(6, "mno");
ht.put(7, "pqrs");
ht.put(8, "tuv");
ht.put(9, "wxyz");
letterCombinationsRecur(digits, 0, ht, res);
return new ArrayList<String>(res);
}
private void letterCombinationsRecur(final String digits, int digPtr, final Hashtable<Integer, String> ht, final ArrayDeque<String> res) {
if (digPtr==digits.length()) {
if (res.peekFirst().equals(""))
res.removeFirst();
return;
}
int inputResCnt = res.size();
ArrayList<String> resAL = new ArrayList<>(res);
String newLastChars = ht.get(digits.charAt(digPtr) - '0');
int nlcLen = newLastChars.length();
for (int nlcIdx=0; nlcIdx<nlcLen; nlcIdx++) {
for (int i=0; i<inputResCnt; i++) {
res.add(resAL.get(i) + newLastChars.charAt(nlcIdx));
}
}
for (int i=0; i<inputResCnt; i++) {
res.removeFirst();
}
letterCombinationsRecur(digits, ++digPtr, ht, res);
}
}Today, I revisited that problem and thought I could use a simplified technique to solve the problem by modifying the above solution to rely less of Level Order BFS-like dequeue population and rely more over recursion. Here's the result that resultantly significantly simpler:
class Solution {
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
if (digits == null || digits.length() == 0)
return result;
String[] mapping = {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
letterCombinationsRecur (digits, 0, "", mapping, result);
return result;
}
void letterCombinationsRecur (String digits, int digitPtr, String currentLetterCombination, String[] mapping, List<String> result) {
if (digitPtr == digits.length()) {
result.add(currentLetterCombination);
return;
}
String currDigLetters = mapping[digits.charAt(digitPtr)-'0'];
for (int i=0; i<currDigLetters.length(); i++) {
letterCombinationsRecur(digits, digitPtr+1, currentLetterCombination+currDigLetters.charAt(i), mapping, result);
}
}
}Let me know your thoughts in the comment section below! Meanwhile, happy coding!!

