【Leetcode】17. 电话号码的字母组合

362 阅读1分钟

题目描述

在这里插入图片描述

// 17. 电话号码的字母组合

// 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 
// 任意顺序 返回。

// 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

题解

// 回溯搜索法
// 
// 在类中创建Map<String, String> map,将数字对应的字符串组成键值对储存到map中,
// 在类中创建答案储存位res,用于储存最终答案。
// 
// 主函数先排序digits为空的时候,
// 然后调用回溯搜索函数backtrack开始递归,
// 定义回溯搜索函数,输入为字符串组合combination,和需要转化的成字符串的数字
// nextDigits。在递归的过程中,如果需要转化的数字nextDigits被使用完了,长度为0;
// 则递归终止,将combination存入答案res中。
// 如果nextDigits还有内容,从左取nextDigits的第一个数字,记为digit,
// 通过map映射获得digit对应的字母串letters,
// for循环遍历letters字母串当中的单个字母letter,遍历索引为i,
// 实际是遍历letters的长度,然后通过.substring(i, i + 1)方法来遍历
// letters字母串中的单个字母,记为letter。
// 递归调用回溯搜索函数backtrack,将letter通过String 加法加到combination中,
// nextDigits则为的.substring(1)。如此循环,最后所有排列的情况都被存入res,
// 返回res即可。

import java.util.HashMap;
class Solution {
    List<String> res = new ArrayList<String>();        
    Map<String, String> phoneMap = new HashMap<>() {{
        put("2", "abc");
        put("3", "def");
        put("4", "ghi");
        put("5", "jkl");
        put("6", "mno");
        put("7", "pqrs");
        put("8", "tuv");
        put("9", "wxyz");
    }};    

    public List<String> letterCombinations(String digits) {
		if (digits.length() == 0)
			return res;
		backtrack("", digits);
		return res;
    }
	
	public void backtrack(String combination, String nextDigits) {
		if (nextDigits.length() == 0) {
			res.add(combination);
		}
		else {
			String digit = nextDigits.substring(0, 1);
			String letters = phoneMap.get(digit);
			for (int i = 0; i < letters.length(); i++) {
				String letter = letters.substring(i, i + 1);
				backtrack(combination + letter, nextDigits.substring(1));
			}
		}
	}
}