fork download
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.Scanner;
  4.  
  5. class Source {
  6.  
  7. public ArrayList<String> letterCombinations(String digits) {
  8. ArrayList<String> result = new ArrayList<>();
  9.  
  10. // Edge case: empty input
  11. if (digits == null || digits.length() == 0) {
  12. return result;
  13. }
  14.  
  15. // Digit-to-letter mapping
  16. HashMap<Character, String> map = new HashMap<>();
  17. map.put('2', "abc");
  18. map.put('3', "def");
  19. map.put('4', "ghi");
  20. map.put('5', "jkl");
  21. map.put('6', "mno");
  22. map.put('7', "pqrs");
  23. map.put('8', "tuv");
  24. map.put('9', "wxyz");
  25.  
  26. // Check for invalid digits like 0,1 or non-numeric
  27. for (char ch : digits.toCharArray()) {
  28. if (!map.containsKey(ch)) {
  29. return result; // return [] if invalid input
  30. }
  31. }
  32.  
  33. backtrack(result, map, digits, 0, new StringBuilder());
  34. return result;
  35. }
  36.  
  37. private void backtrack(ArrayList<String> result, HashMap<Character, String> map,
  38. String digits, int index, StringBuilder current) {
  39. if (index == digits.length()) {
  40. result.add(current.toString());
  41. return;
  42. }
  43.  
  44. char digit = digits.charAt(index);
  45. String possibleLetters = map.get(digit);
  46.  
  47. for (char letter : possibleLetters.toCharArray()) {
  48. current.append(letter);
  49. backtrack(result, map, digits, index + 1, current);
  50. current.deleteCharAt(current.length() - 1);
  51. }
  52. }
  53.  
  54. // Only for local/SPOJ testing
  55. public static void main(String[] args) {
  56. Scanner sc = new Scanner(System.in);
  57. String digits = sc.nextLine().trim();
  58.  
  59. Source src = new Source();
  60. ArrayList<String> ans = src.letterCombinations(digits);
  61.  
  62. System.out.println(ans);
  63. }
  64. }
  65.  
Success #stdin #stdout 0.18s 54628KB
stdin
23
stdout
[ad, ae, af, bd, be, bf, cd, ce, cf]