java数据结构与算法刷题-----LeetCode17. 电话号码的字母组合

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路
  1. 先用hash表存储九键键盘映射,保存不同数字按键对应的字母是什么
  2. 然后通过回溯算法枚举即可。
  3. 因为这道题是要组合,而不是排列。也就是说"ad"和"ba"是相同答案,只保留一个即可
  4. 按照题目的示例1来看,可以看出是按键2依次遍历,然后按键3依次遍历。例如按键2先遍历a,然后按键3依次遍历d,e,f。组成了"ad",“ae”,“af”. 然后回到按键2,遍历b,然后按键3,依次遍历d,e,f。以此类推。
  5. 很经典的回溯题目。这种题嵌套for循环显然不行,因为8个有字母的按键,需要8层for循环。只能用递归,也就是回溯来解决。
代码

在这里插入图片描述

class Solution {
    char[][] hash = new char[10][];//存储9键型键盘每个键对应的字母,0-9
    String digits;//为了回溯方法,少传参,提高代码可读性,将题目给的字符串,放到公共变量
    int length;//长度也放到公共变量中
    public void init(){//初始化0-9每个按键对应的字母
        String str = "abcdefghijklmnopqrstuvwxyz";
        // int index = 0;
        for(int i = 2,index = 0;i <= 9;i++){
            if(i==7 || i==9) hash[i] = new char[4];//7和9号键有4个字母
            else hash[i] = new char[3];//其它都是3个
            for(int j = 0;j<hash[i].length;j++) hash[i][j] = str.charAt(index++);
        }
    }
    ArrayList<String> list = new ArrayList<>();//最终需要返回的答案
    //入口方法
    public List<String> letterCombinations(String digits) {
        init();//初始化hash表
        this.digits = digits;//保存字符串到全局
        this.length = digits.length();//保存长度到全局
        char[] records = new char[length];//保存当前枚举的组合
        backTracking(0,records);//进入回溯算法
        return list;
    }

    /**
     * 回溯算法
     * @param row 表示当前枚举的是第几个按键的字母
     * @param records //保存当前正在枚举的字母组合
     */
    public void backTracking(int row,char[] records){
        if(row > length-1) return;//如果枚举完成,就返回
        else{
            int hashRow = digits.charAt(row)-48;//获取题目给的字符串中,第row个按键是哪个
            for(int i = 0;i<hash[hashRow].length;i++){//遍历第row个按键可输入的字母
                records[row] = hash[hashRow][i];//当前位置依次选用这些字母枚举
                if(row < length-1)  backTracking(row+1,records);//如果还有按键,就继续下一个按键的枚举
                else list.add(new String(records));//否则就枚举出了一个结果
            }
        }
    }
}
  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值