LeetCode-17. Letter Combinations of a Phone Number

题目链接https://leetcode.com/problems/letter-combinations-of-a-phone-number/

题目还是蛮有趣的,思路比较直接:使用特定的数据结构将数字2-9到字母的映射保存下来,然后进行组合(combination)就行,组合可以用递归的方法。

因为是组合,每个”数字字符”都含有多个“字母字符”,每次从每个”数字字符”中选择任意一个“字母字符”(选择对象不确定),为保证不重复就按顺序选取:

选择的次数n(数字字符串的长度)也是不确定(由输入决定),很容易想到用n重循环然后来暴力的思维,当然用递归使其简化:

 

class Solution {
    
    public static char[] symbol1={'a','d','g','j','m','p','t','w'};//起始字母字符
    
    public static int[] number={3,3,3,3,3,4,3,4};//每个键代表的字母字符个数
    
    public static LinkedList<String> ret=new LinkedList<String>();
    
    public static List<String> letterCombinations(String digits) {
        ret.clear();  //使用静态变量存储最终结果时一定要清空
        if(digits.length()==0)
            return ret;
    	recursion(0,digits,"");
    	return ret;
    }
    
    
    public static void recursion(int idx,String digits,String s)
    {
    	if(idx>=digits.length())
    	{
    		ret.add(s);
    		return;
    	}
    	for(int i=0;i<number[digits.charAt(idx)-'2'];i++)
    	{
    		s=s+(char)(symbol1[digits.charAt(idx)-'2']+i);
    		recursion(idx+1,digits,s);
    		s=s.substring(0, s.length()-1);//递归调用结束后需要将s去掉一位字母字符以回到递归调用前的状态
    	}
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值