標籤:leetcode
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"].
題意:一個有數字組成的字串,按照手機上數字所對應的字串,輸出所有可以出現的組合。字串中的順序由小到大
解題思路:這是動態累加的程式。如果說,"23",我先求出2的組合,然後將2的組合與3中所對應的所有字元一一組合,這顯而易見。那如果是"234"呢。那之前有已經求出了23的所有組合,接下來,只要將23組合和4中的每個字元一一組合就可以了。同理類推,遞迴原理。
public static List<String> letterCombinations(String digits) { List<String> list=new ArrayList<String>(); List<String> res=new ArrayList<String>(); int len=digits.length(); if(len==0)return res; char ch; String tmp=null; for(int i=0;i<len;i++) { ch=digits.charAt(i); if(ch!=‘0‘&&ch!=‘1‘) { tmp=digit2String(ch); list.add(tmp); } } len=list.size(); for(int i=0;i<len;i++) { res=mergeListAndString(res,list.get(i)); } return res; } static List<String> mergeListAndString(List<String> list,String str) { if(str==null)return list; List<String> resTmp=new ArrayList<String>(); if(list.size()==0) { for(int i=0;i<str.length();i++) list.add(String.valueOf(str.charAt(i))); return list; }else { for(int j=0;j<str.length();j++) { for(int k=0;k<list.size();k++) { resTmp.add(str.charAt(j)+list.get(k)); } } return resTmp; } } static String digit2String(char ch) { String str=null; switch(ch) { case ‘2‘:str="abc";break; case ‘3‘:str="def";break; case ‘4‘:str="ghi";break; case ‘5‘:str="jkl";break; case ‘6‘:str="mno";break; case ‘7‘:str="pqrs";break; case ‘8‘:str="tuv";break; case ‘9‘:str="wxyz";break; default: str=null;break; } return str; }
這是第一版代碼,雖然通過了。但是代碼很長。接下來,看看有沒有辦法精簡一下。
public static List<String> letterCombinations(String digits) { String[] digits2String={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; List<String> res=new ArrayList<String>(); int len=digits.length(); if(len==0)return res; char ch; String tmp=null; for(int i=0;i<len;i++) { ch=digits.charAt(i); if(ch<=‘9‘&&ch>‘1‘) { tmp=digits2String[ch-‘0‘]; res=mergeListAndString(res,tmp); } } return res; } static List<String> mergeListAndString(List<String> list,String str) { if(str==null)return list; List<String> resTmp=new ArrayList<String>(); if(list.size()==0) { for(int i=0;i<str.length();i++) list.add(String.valueOf(str.charAt(i))); return list; }else { for(int j=0;j<list.size();j++) { for(int k=0;k<str.length();k++) { resTmp.add(list.get(j)+str.charAt(k)); } } return resTmp; } }
[Java]LeetCode17 Letter Combinations of a Phone Number