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!!
Why use recursion when a simple loops will also work for this problem. Code at https://www.onlinegdb.com/BkjhIiC38
ReplyDeleteJust saw the code in your link. Looks somewhat more elaborate than necessary, but does the job. Good effort!
DeletePlease feel free to share your working solution with one simple loop. That will be delightful to see and will enlighten us! Bear in mind that digits can be of any length!
ReplyDelete