首页 > 其他分享 >力扣---17. 电话号码的字母组合

力扣---17. 电话号码的字母组合

时间:2023-02-20 01:22:46浏览次数:43  
标签:digits --- char tem list 力扣 add num 字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:
输入:digits = ""
输出:[]

示例 3:
输入:digits = "2"
输出:["a","b","c"]

提示:
    0 <= digits.length <= 4
    digits[i] 是范围 ['2', '9'] 的一个数字。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

看见题目的第一想法,是利用for循环进行嵌套遍历,但很难直接进行嵌套,可以利用回溯来解决。

思路见注释

class Solution {
//    存储答案,把这些放类中,而不是放方法里,是为了让代码更简洁点,不需要进行传参。
    List<String> list = new ArrayList<>();
//    用数组存储查询更快。
    char[][] number = new char[][] {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', 'k', 'l'},
            {'m', 'n', 'o'}, {'p', 'q', 'r', 's'}, {'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}};
    public List<String> letterCombinations(String digits) {
        if (digits.length() == 0) {
            return list;
        }
        add(new StringBuilder(), 0, digits);
        return list;
    }
    public void add(StringBuilder tem, int num, String digits) {
//        终止回溯的条件
        if (num == digits.length()) {
            list.add(tem.toString());
            return;
        }
//        本次使用到的char数组
//        digits.charAt(num) - '2'即对应字符在数组中的下标。
        char[] arr = number[digits.charAt(num) - '2'];
        for (char a : arr) {
            add(tem.append(a), num + 1, digits);
//            需要删除最后一个,如果是String类型,省略这一步(string类型不可改变的特点会自动达到回溯的效果。)
            tem.deleteCharAt(tem.length() - 1);
        }
    }
}

 

标签:digits,---,char,tem,list,力扣,add,num,字母组合
From: https://www.cnblogs.com/allWu/p/17136042.html

相关文章