题目
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"].
这个题比较好的方法就是利用递归来求解,但是在C中不方便来连接两个字符串的各种组合,可能用java做这道题会比较好。
用java来实现的代码如下:
//这个题用java来更好实现一点,用C稍微复杂点
public class Solution {
public Solution(){
}
// public static void main(String[] args){
// Solution s=new Solution();
// List<String> list=new ArrayList();
// list=s.letterCombinations("234");
// for(String str:list){
// System.out.print(str+" ");
// }
// }
public List<String> letterCombinations(String digits) {
//先建立一个map
Map<Integer,List<String>> map=new HashMap<Integer,List<String>>();
map.put(0,Arrays.asList(""));
map.put(1,Arrays.asList(""));
map.put(2, Arrays.asList("a","b","c"));
map.put(3, Arrays.asList("d","e","f"));
map.put(4, Arrays.asList("g","h","i"));
map.put(5, Arrays.asList("j","k","l"));
map.put(6, Arrays.asList("m","n","o"));
map.put(7, Arrays.asList("p","q","r","s"));
map.put(8, Arrays.asList("t","u","v"));
map.put(9, Arrays.asList("w","x","y","z"));
List<String> result=new ArrayList<String>();
List<String> tempList=new ArrayList<String>();
List<String> tempResult;
if(digits==null){
return result;
}
if(digits.length()==0){
return result;
}
else if(digits.length()==1){
result=map.get(digits.charAt(0)-'0');
}
else{
//取出digits中第一个字符,然后将剩余的字符利用递归来进行求解
tempList=map.get(digits.charAt(0)-'0');
tempResult=letterCombinations(digits.substring(1));
//将tempList和tempResult组合下就是我们最终的结果
for(String str1:tempList){
for(String str2:tempResult){
result.add(str1+str2);
}
}
}
return result;
}
}
这种方法的AC结果如下 Runtime:3ms
这样我发现效率真的不高也,于是,决定将Map作为类的一个属性。在构造函数中对其进行初始化。发现运行时间减少到2ms。
具体代码如下:
package com.wrh.leetcode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//这个题用java来更好实现一点,用C稍微复杂点
public class Solution {
Map<Integer,List<String>> map=new HashMap<Integer,List<String>>();
public Solution(){
map.put(0,Arrays.asList(""));
map.put(1,Arrays.asList(""));
map.put(2, Arrays.asList("a","b","c"));
map.put(3, Arrays.asList("d","e","f"));
map.put(4, Arrays.asList("g","h","i"));
map.put(5, Arrays.asList("j","k","l"));
map.put(6, Arrays.asList("m","n","o"));
map.put(7, Arrays.asList("p","q","r","s"));
map.put(8, Arrays.asList("t","u","v"));
map.put(9, Arrays.asList("w","x","y","z"));
}
public static void main(String[] args){
Solution s=new Solution();
List<String> list=new ArrayList();
list=s.letterCombinations("234");
for(String str:list){
System.out.print(str+" ");
}
}
public List<String> letterCombinations(String digits) {
//先建立一个map
List<String> result=new ArrayList<String>();
List<String> tempList=new ArrayList<String>();
List<String> tempResult;
if(digits.length()==0){
return null;
}
else if(digits.length()==1){
result=map.get(digits.charAt(0)-'0');
}
else{
//取出digits中第一个字符,然后将剩余的字符利用递归来进行求解
tempList=map.get(digits.charAt(0)-'0');
tempResult=letterCombinations(digits.substring(1));
//将tempList和tempResult组合下就是我们最终的结果
for(String str1:tempList){
for(String str2:tempResult){
result.add(str1+str2);
}
}
}
return result;
}
}
这种情况的AC结果如下:
就这样改变了下,运行时间就少了许多,原因是,当我们吧Map作为类的属性时,当我们new一个对象时,之后有一个Map对象,而前者作为函数的局部变量时,每一次递归都会为其分配内存并初始化,这样会极大的浪费时间。