leetCode练习(17)

题目:Letter Combinations of a Phone Number
难度:medium
问题描述:

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.

关键词:Backtracking,String

解题思路:
首先分析问题,这是一个穷举问题,需要解得所有的可能值。对于2-9,按下后有不同的可能性,对于1和0,则不会有任何输出,等于“没有按键”。由此,我们可以对输入进行预处理(通过String prestr(String str)函数)。例如,输入“0251”,实际处理的是字符串“25”。
预处理之后,我们创建一个二维数组table[10][4],table[I][j]=按键I代表的第j中可能字符,table[3][2]就代表f(j从0开始)。
接下来,我们可以通过回溯算法来对所有可能进行穷举。回溯算法其实就是一个迭代的过程,类似于深度优先搜索。
具体代码如下:
public class Solution {
     String[] strc;
	 String temp="";
	 int border;
	  String[][] table=new String[10][4];
    public List
    
    
     
      letterCombinations(String digits) {
        ArrayList
     
     
      
       list=new ArrayList<>();
        tableinit();
		if(digits==null){
			return list;
		}
		if(digits==""){
		    return list;
		}
		digits=prestr(digits);
		strc=new String[digits.length()];
		border=digits.length();	
//		System.out.println("border="+border);
	
		
		solution(digits,list,0);
//		System.out.println("--------");
		return list;	
    }
    public void tableinit(){
		table[0][0]="";table[0][1]="";table[0][2]="";table[0][3]="";
		table[1][0]="";table[1][1]="";table[1][2]="";table[1][3]="";
		table[2][0]="a";table[2][1]="b";table[2][2]="c";table[2][3]="";
		table[3][0]="d";table[3][1]="e";table[3][2]="f";table[3][3]="";
		table[4][0]="g";table[4][1]="h";table[4][2]="i";table[4][3]="";
		table[5][0]="j";table[5][1]="k";table[5][2]="l";table[5][3]="";
		table[6][0]="m";table[6][1]="n";table[6][2]="o";table[6][3]="";
		table[7][0]="p";table[7][1]="q";table[7][2]="r";table[7][3]="s";
		table[8][0]="t";table[8][1]="u";table[8][2]="v";table[8][3]="";
		table[9][0]="w";table[9][1]="x";table[9][2]="y";table[9][3]="z";
	}
	public void solution(String str,ArrayList
      
      
       
        list,int cs){
		int cengshu=cs;
		String tempstr;
//		System.out.println("cengshu="+cengshu);
		
		if(str==null||str.equals("")){
			return;
		}
		int i=(int)str.charAt(0)-(int)'0';
//		System.out.println("截取字符:"+i);
		for(int j=0;j<4;j++){
			strc[cengshu]=table[i][j];
			if(strc[cengshu]=="")	continue;
//			System.out.println("strc["+cengshu+"]="+strc[cengshu]);		
			if(cengshu+1==border){	
				for(int k=0;k<=cengshu;k++){
//					System.out.println("边界了  合体"+"strc["+k+"]="+strc[k]);	
					temp=temp+strc[k];					
				}
				list.add(temp);
				temp="";
			}else{		
				tempstr=str.substring(1);
//				System.out.println("层数未到最大值:substr="+tempstr);
				solution(tempstr,list,(cengshu+1));
			}
		}
	}
	public String prestr(String str){
		StringBuffer bstr=new StringBuffer(str);
		for(int i=0;i
       
       
      
      
     
     
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值