leetcode17 电话号码的组合

本文介绍了一种解决电话号码字母组合问题的算法,通过递归方式生成所有可能的字母组合,适用于输入为2到9的数字串。文章详细解释了代码实现过程,包括初始化查询列表、使用StringBuilder进行字符串构建,以及如何避免引用问题。

leetcode17

代码:

class Solution {
    public List<String> letterCombinations(String digits) {
        int length=digits.length();
        List<String> query=new ArrayList<String>();
        query.add("0");
        query.add("0");
        query.add("abc");
        query.add("def");
        query.add("ghi");
        query.add("jkl");
        query.add("mno");
        query.add("pqrs");
        query.add("tuv");
        query.add("wxyz");
        
        
        List<StringBuilder> list=new ArrayList<StringBuilder>();
        List<String> result=new ArrayList<String>();
        if(digits.equals(""))
            return result;
        StringBuilder front=new StringBuilder();
        func(list,digits,0,front,query);
        
        Iterator<StringBuilder> iter=list.iterator();
        while(iter.hasNext()) {
        	result.add(iter.next().toString());
        }
		return result;
    }
    
    public  void func(List<StringBuilder> list,String digits,int n,StringBuilder front,List<String> query) {
		int j;
		String ad=query.get( digits.charAt(n)-48 );
		
		if(digits.charAt(n)=='7'||digits.charAt(n)=='9')
			j=4;
		else 
			j=3;
		if(n==digits.length()-1) {
			for(int i=0;i<j;i++) {
				
				StringBuilder sb=front.append( ad.charAt(i) );
//				list.add(sb);不能用这个,因为这里sb是和front同一个引用,所以待会front删除字符时,sb也删除了,而list里添加的是sb的引用,所以list中的也是删了字符的;所以最好是重新建一个
				list.add(new StringBuilder(front));
				front=front.deleteCharAt(front.length()-1);
			}

			
		}
		else{
			for(int i=0;i<j;i++) {
				front.append(ad.charAt(i));
				func(list,digits,n+1,front,query);
				front=front.deleteCharAt(front.length()-1);
			}
			
		}

	}
    
}

图示:

思想是递归。用蛮力法写多个for循环是不可能的,因为不知道要写几个for循环。以"234"为例:首先进行到a,然后进行到d,然后进行到g(最底层),用一个字符串把前面的字符保留下来,和最后一层拼接,list add一个字符串;然后进行下一次循环和h add一个字符串。也就是说在最底层是for循环 list add 字符串,在其他层是for循环继续递归到下一层。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值