leetcode:letter-combinations-of-a-phone-number

给定一个数字字符串,返回该数字可能代表的所有可能的字母组合。
下面给出了数字到字母的映射(就像在电话按钮上一样)。
输入:数字串 “23”
输出: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]。
注意: 虽然上面的答案是按字典顺序排列的,但您的答案可以是您想要的任何顺序。

解题思路:

  1. 对于此类枚举问题,我们首先应该想到的是用递归来实现求解
  2. 分析题目,可以发现不同的数字对应不同的字母,故用字典来实现该数据结构
  3. 用一个变量 begin 来记录已生成字符串中包含的字母个数,当 begin 个数等于传入的参数时,添加到结果数据结构中

代码如下:

    // 全局变量来存储结果
    ArrayList<String> res = new ArrayList<>();
    public ArrayList<String> letterCombinations(String digits) {
        // 将参数字符串转换成字符数组   
	char [] chars = digits.toCharArray();
	
	//  将题目中的数字与字母转换成字典的形式
        ArrayList<char []> ll = new ArrayList<>();
        char [] a2 = {'a', 'b', 'c'};
        char [] a3 = {'d', 'e', 'f'};
        char [] a4 = {'g', 'h', 'i'};
        char [] a5 = {'j', 'k', 'l'};
        char [] a6 = {'m', 'n', 'o'};
        char [] a7 = {'p', 'q', 'r', 's'};
        char [] a8 = {'t', 'u', 'v'};
        char [] a9 = {'w', 'x', 'y', 'z'};
        ll.add(a2);ll.add(a3);ll.add(a4);ll.add(a5);
        ll.add(a6);ll.add(a7);ll.add(a8);ll.add(a9);

        combine(chars,ll,"",0);
        return res;
    }


    private void combine(char[] s, ArrayList<char []> ll, String t, int begin){
        // 如果 begin 的长度等于传入参数的长度,则添加进结果集中
	if(begin == s.length){
            res.add(t);
            return;
        }
        
	// 递归取出各数字对应的字符
        for(int i = 0; i < ll.get(s[begin] - '2').length; i++){
            combine(s, ll, t + String.valueOf(ll.get(s[begin] - '2')[i]),begin + 1);
        }
    }

转载于:https://my.oschina.net/happywe/blog/3070768

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值