算法:回溯一 电话拨号数字里面的字母组合 letter-combinations-of-a-phone-number

题目

地址:
https://leetcode.com/problems/letter-combinations-of-a-phone-number/

描述:
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
在这里插入图片描述

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

此题目用回溯解法,遍历数组所有解,注意递归的退出条件。

遍历解法

顺序执行分解:

  1. 初始化二维数组char[][] map, 存储数字以及字母的关系,map[digit - '2'] 获取字母数组。
  2. 遍历上一次的字符串List,遍历并拼接新的字符(字符从遍历字符数组所得)。
public List<String> letterCombinationWithIterate(String digits) {
    List<String> result = new ArrayList<>();
    if (digits == null || digits.length() == 0) {
      return result;
    }

    char[][] map = new char[8][];
    map[0] = "abc".toCharArray();
    map[1] = "def".toCharArray();
    map[2] = "ghi".toCharArray();
    map[3] = "jkl".toCharArray();
    map[4] = "mno".toCharArray();
    map[5] = "pqrs".toCharArray();
    map[6] = "tuv".toCharArray();
    map[7] = "wxyz".toCharArray();

    result.add("");
    for (char digit: digits.toCharArray()) {
      result = append(result, map[digit - '2']);
    }

    System.out.println("result > " + Arrays.toString(result.toArray()));

    return result;
  }

  private List<String> append(List<String> lastList, char[] charArray) {
    List<String>  nextList = new ArrayList<>();
    for (String s: lastList) {
      for (char c: charArray) {
        nextList.add(s + c);
      }
    }

    return nextList;
  }

回溯解法

回溯分解:

  1. 回溯出口为nextDigits == null || nextDigits.length() == 0
  2. combination为累计拼接的结果
Map<Character, String> phone = new HashMap<Character, String>() {{
    put('2', "abc");
    put('3', "def");
    put('4', "ghi");
    put('5', "jkl");
    put('6', "mno");
    put('7', "pqrs");
    put('8', "tuv");
    put('9', "wxyz");
  }};

  private List<String> resultList = new ArrayList<>();

  public List<String> letterCombinationsWithBacktrack(String digits) {
    if (digits == null || digits.length() == 0) {
      return resultList;
    }
    backTrack("", digits);

    return resultList;
  }

  public void backTrack(String combination, String nextDigits) {
    if (nextDigits == null || nextDigits.length() == 0) {
      resultList.add(combination);
      return;
    }
    char c = nextDigits.charAt(0);
    for (char item: phone.get(c).toCharArray()) {
      backTrack(combination + item, nextDigits.substring(1));
    }
  }


代码下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/LetterCombinationsOfAPhoneNumber.java

发布了127 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zgpeace/article/details/103580314