leetcode_Letter Combinations of a Phone Number

来源:互联网 发布:演唱会购票软件 编辑:程序博客网 时间:2024/05/30 23:17

描述:

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"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

思路:

本题目要实现的效果就是产生一系列广义有序的字符串序列,本来想假如知道digits字符串长度的话,可以搞一个n层循环,但是digits的长度是未知的。想了好久,想到了用递归来实现本题目要实现的功能,每个数字循环到数字所代表字符的个数大小时,返回上一级递归,然后再在上一级的循环层次计数上再加1即可。

当字符的长度等于digits的长度时,说明已经产生一组有效的字符串,存储起来,然后将最后一个字符删除,继续循环。。。。

最后,当index<0时,说明整个循环已经结束,over!但是在具体实现的过程中,递归理解起来比较复杂,具体如何结束,这个判断条件需要特别注意下,假如只是简单的return可能达不到应有的效果。

总之,这题目搞了两个多小时,感觉有点乱。

代码:

boolean flag=true;int digitsLength=0;int arr[];List<String>list=new ArrayList<String>();StringBuilder sBuilder=new StringBuilder();Map<Integer, String>map=new HashMap<Integer, String>();public List<String> letterCombinations(String digits) {if(digits==null||digits.length()==0)return list;        digitsLength=digits.length();        arr=new int[digitsLength];        int digitsArr[]=new int[]{2,3,4,5,6,7,8,9};        String strArr[]=new String[]{"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};        int len=digitsArr.length;        Arrays.fill(arr, 0);        for(int i=0;i<len;i++)        map.put(digitsArr[i], strArr[i]);//数字对应的字符        combinations(digits,0);        return list;    }public void combinations(String digits,int index){if(!flag)//flag为false时彻底结束return;if(index<0){flag=false;//index<0时彻底结束return;}int number=digits.charAt(index)-'0';String string=map.get(number);//获得数字对应的字符int len=string.length();int upLevelIndex=0;if(index<digitsLength-1)//还没有达到有效字符的长度{if(arr[index]==len)//达到该数字对应字符的最大值{arr[index]=0;upLevelIndex=sBuilder.length()-1;//向上面一层循环前,先把上面一层那个数字对应的字符删去if(upLevelIndex>=0){sBuilder.deleteCharAt(upLevelIndex);combinations(digits,index-1);}else {flag=false;//到达最前面return;}}else{sBuilder.append(string.charAt(arr[index]));arr[index]++;combinations(digits,index+1);}}else//达到有效字符串的长度{for(int i=0;i<len;i++){sBuilder.append(string.charAt(i));list.add(sBuilder.toString());//保存结果sBuilder.deleteCharAt(sBuilder.length()-1);//删除最后一个字符,继续循环}upLevelIndex=sBuilder.length()-1;//向上面一层循环前,先把上面一层那个数字对应的字符删去if(upLevelIndex>=0){sBuilder.deleteCharAt(upLevelIndex);combinations(digits,index-1);}else {flag=false;//到达最前面return;}}}

结果:


0 0
原创粉丝点击