0
点赞
收藏
分享

微信扫一扫

17. 电话号码的字母组合

朱悟能_9ad4 2022-04-27 阅读 94

17. 电话号码的字母组合

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

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

示例 1:

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

输入:digits = “”
输出:[]
示例 3:

输入:digits = “2”
输出:[“a”,“b”,“c”]

思考

第一步 获取digits对应的各个按键数值并保存在ints数组中

第二步 构建映射字符串数组letter,每个按键对应几个字母

第三步 利用回溯法,获取所有结果

Step 1获取按键数值

      int[] ints=new int[digits.length()];
      for (int i = 0; i < digits.length(); i++) {
            ints[i] = (int) digits.charAt(i) - (int)('0');
        }

Step 2 创建映射字符串数组

 String[] letter = new String[]{"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

Step 3 回溯法

回溯法其实就是一个暴利搜索,都可以将问题转化为树状结构。

以digits= 23为例

在这里插入图片描述

这里s字符串充当临时栈

真实的按钮数值与映射字符串数组坐标差2

  • int index = ints[startIndex]-2;
class Solution {
    String[] letter = new String[]{"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    String s="";
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        if(digits.equals("")) return list;
        int[] ints=new int[digits.length()];

        for (int i = 0; i < digits.length(); i++) {
            ints[i] = (int) digits.charAt(i) - (int)('0');
        }
        int startIndex = 0;
        backTracking(list,ints,startIndex);
        return list;
        
    }

    private void backTracking(List<String> list, int[] ints,int startIndex) {
        if(s.length() == ints.length){
            list.add(new String(s));
            return;
        }

        int index = ints[startIndex]-2;
        for (int j = 0; j < letter[index].length(); j++) {
            s = s + String.valueOf(letter[index].charAt(j));
            backTracking(list,ints,startIndex+1);
            s = s.substring(0,s.length()-1);
        }
    }
}
举报

相关推荐

0 条评论