leetcode17:Letter Combinations of a Phone Number

Letter Combinations of a Phone Number

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

这个题的思想并不难,难得是实现,在我的解法中困难点在于根据传入的数字字符串的长度,如何动态的实现for循环的次数,我用的是递归。解题的思路很简单,将数字和对应的字母存入map中,数字作为key,字母作为value,根据传入的数字字符串,提取相应的value,循环的进行组合。


package leetcode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class leet17 {
	
//	Map<Character,char[]> map = new HashMap<Character,char[]>();
//	{
//		
//		map.put('1', new char[]{});
//		map.put('2',new char[]{'a','b','c'});
//		map.put('3', new char[]{'d','e','f'});
//		map.put('4',new char[]{'g','h','i'});
//		map.put('5',new char[]{'j','k','l'});
//		map.put('6',new char[]{'m','n','o'});
//		map.put('7', new char[]{'p','q','r','s'});
//		map.put('8', new char[]{'t','u','v'});
//		map.put('9', new char[]{'w','x','y','z'});
//		map.put('0', new char[]{});
//		
//	}
	
	Map<Character,ArrayList<String>> map = new HashMap<Character,ArrayList<String>>();
	{
		/**
		 * 初始化映射
		 */
		ArrayList<String> list = new ArrayList<String>();
		list.add("");
		map.put('1', list);//存储成ArrayList的原因是由于后面递归方便一点
		
		list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		map.put('2',list);
		
		list = new ArrayList<String>();
		list.add("d");
		list.add("e");
		list.add("f");
		map.put('3', list);
		
		list = new ArrayList<String>();
		list.add("g");
		list.add("h");
		list.add("i");
		map.put('4',list);
		
		list = new ArrayList<String>();
		list.add("j");
		list.add("k");
		list.add("l");
		map.put('5',list);
		
		list = new ArrayList<String>();
		list.add("m");
		list.add("n");
		list.add("o");
		map.put('6',list);
		
		list = new ArrayList<String>();
		list.add("p");
		list.add("q");
		list.add("r");
		list.add("s");
		map.put('7', list);
		
		list = new ArrayList<String>();
		list.add("t");
		list.add("u");
		list.add("v");
		map.put('8', list);
		
		list = new ArrayList<String>();
		list.add("w");
		list.add("x");
		list.add("y");
		list.add("z");
		map.put('9', list);
		
		list = new ArrayList<String>();
		list.add("");
		map.put('0', list);
		
	}
	public static void main(String[] args) {
		
		leet17 lee = new leet17();
		List<String> result = lee.letterCombinations("23");
		System.out.println(result.toString());
	}
	
	public List<String> letterCombinations(String digits) {
		
		//存储digits中每一个数字对应的List,因为映射中每一个数字对应的就是一个ArrayList 
		List<List<String>> temp = new ArrayList<List<String>>();
		 for(int i = 0;i < digits.length();i++){//循环的获取每一个数字对应的List
			 
			 temp.add(map.get(digits.charAt(i)));
		 }
		//获取temp的大小,即就是digits中有几个数字
		 int level = temp.size();
		//递归的进行组合,因为有几个数字就需要进行几次循环,这个需要动态的进行
		 List<String> result = Recursive(temp,level);
		return result;
	        
	}
	
	/**
	 * 
	 * 因为事先不知道需要进行几次for循环,所以需要用递归的方法动态的根据digits中的数字的个数决定循环的次数
	 * 当level等于1时,表示temp中的组合结束只剩一个List在其中了。所以返回结果
	 * 
	 * 递归的方法是先组合temp中的第一和第二个list,然后删除第一个第二个list,将组合后的list添加进去,
	 * level减1,重新进行递归,直到temp中只剩一个list表示结束
	 * 
	 */
	public static List<String> Recursive(List<List<String>> temp,int level){
		
		if(level == 1){			
			return temp.get(0);
		}else{
			List<String> str1 = temp.get(0);//temp中的第一个list
			List<String> str2 = temp.get(1);//temp中的第二个list
			
			//前面两个list组合后的list,使用List的原因是组合后的数组大小会增大所以,
			//ArrayList可以适应数组的动态增长,方便不用事先指定数组大小
			List<String> str = new ArrayList<String>();
													   
			for(int i = 0;i < str1.size();i++){
				for(int j = 0;j < str2.size();j++){
					str.add(str1.get(i)+str2.get(j));
				}
			}
			temp.remove(0);//移除第一个list
			temp.remove(0);//移除第二个list
			temp.add(str);//添加组合后的list
			Recursive(temp,level - 1);//进行递归
		}
		return temp.get(0);				
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值