Leetcode011--电话号码上的单词组合

一、原题



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. 




二、中文



给定一个数字串,返回数字上所有字符的所有组合,数字到字符的映射如上图所示。 
注意: 尽管上面的结果以字符顺序排列的,你可以以任何顺序返回结果。 



三、举例



比如数组输入的是23,那么有ad,ae,af,bd,be,bf,cd,ce,cf 等多种组合



四、思路



本来是看大神的思路,结果是没有看懂的,这个有点复杂,结果自己按照比较笨的思路来吧,也是通过一个小递归的思想,每次将两个按键上的字母想组合



五、程序


package LeetCode;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

//给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组。 
public class Leetcode012 {
	private static int f;

	public static void main(String args[]){
		List<String> list = new LinkedList<String>();
		list = letterCombination("234");
		
		Iterator<String> iterator = list.iterator();
		while(iterator.hasNext()){
			System.out.print(iterator.next()+ " ");
			f++;
			if(f % 5 == 0){
				System.out.println();
			}
		}
	}
	
	private static String[] map = {
	            "abc",
	            "def",
	            "ghi",
	            "jkl",
	            "mno",
	            "pqrs",
	            "tuv",
	            "wxyz",
	};
	private static char[] charArrays;
	//仅在第一次执行的时候初始化list3的标志位
	private static int flag = 0;
	//第一次执行的时候复制list1的数组,目的值断开list1的引用关系,要不list1.clear()会清楚list1中的内容,因为是引用
	private static final List<String> list3 = new LinkedList<String>();
	

    public static List<String> letterCombination(String digits) {
    	//list2用来存储连接操作之后返回的数组,list1用来接收新传入的数组
    	List<String> list2 = new LinkedList<String>();
    	List<String> list1 = new LinkedList<String>();
    	
    	charArrays = digits.toCharArray();

    	//遍历一遍,既不等于'0',也不等于'1'
    	for(int i = 0; i < charArrays.length; i++){ 		
    		if(charArrays[i] != '0' && charArrays[i] != '1'){
    			
    			//将其转换成数字
    			int num = charArrays[i] - '2';
    			
    			char[] cies = (map[num]).toCharArray();

    			for(int j = 0; j < cies.length; j++){
    				list1.add(String.valueOf(cies[j]));
    				
    				//当第一次执行的时候才将值传给list3,这样才可以保证list3中只有abc,因为是引用,要不会增加了
    				if(flag  == 0){
    					list3.add(String.valueOf(cies[j]));
    				}
    			}
    			
    			flag++;

    			//将两个字符串进行组合
    			list2 = combinationString(list1, list2);
    		}
    		list1.clear();
    	}
    	return list2;
    }
    
    /**
     * 将两个字符串链表进行组合
     * @param list1 新的需要组合的字符串链表
     * @param list2 原来的字符串链表
     * @return 返回一个新的字符串链表
     */
    public static List<String> combinationString(List<String> list1, List<String> list2){
    	List<String> listTemp = new LinkedList<String>();
    	
    	String[] array1 = list1.toArray(new String[list1.size()]);  
    	String[] array2 = list2.toArray(new String[list2.size()]);  
    	
    	if(array2.length <= 0){
    		return list3;
    	}else{
	    	for(int i = 0; i < array1.length; i++){
	    		for(int j = 0; j < array2.length; j++){
	    			listTemp.add(array1[i]+array2[j]);
	    		}
	    	}
    	}

    	return listTemp;
    }
}


-------------------------------output---------------------------------------

gda gdb gdc gea geb 
gec gfa gfb gfc hda 
hdb hdc hea heb hec 
hfa hfb hfc ida idb 
idc iea ieb iec ifa 
ifb ifc 



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值