17. Letter Combinations of a Phone Number
最开始尝试用非递归结构写,想到表示是否访问写起来比较复杂与费空间,就改成递归结构了。这个版本有待优化。
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args){
String ss = "2";
Solution s = new Solution();
s.letterCombinations(ss);
}
public List<String> letterCombinations(String digits) {
String[] key = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int n = digits.length();
int[] values = new int[n];
String[] cand = new String[n];
for(int i=0;i<n;i++){
values[i] = Integer.parseInt(String.valueOf(digits.charAt(i)));
cand[i] = key[values[i]];
//if(len>0) product *= cand[i].length;
}
//String[] res = new String[product];
List<String> res = new ArrayList<String>();
res = dfs(0,cand);
return res;
}
private List<String> dfs(int index,String[] cand){
int n = cand.length;
List<String> res = new ArrayList<String>();
if(index==n) return res;
for(int k=0;k<cand[index].length();k++){
String ans = "";
ans += String.valueOf(cand[index].charAt(k));
List<String> latter = dfs(index+1,cand);
if(latter.size()==0) res.add(ans);
else{
for(String s:latter){
String end = "";
end += ans;
end += s;
res.add(end);
}
}
}
return res;
}
}
为什么bfs 的运行效率比dfs要高?
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args){
String ss = "2";
Solution s = new Solution();
s.letterCombinations(ss);
}
public List<String> letterCombinations(String digits) {
String[] key = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> res = new ArrayList<String>();
if(digits.length()==0) return res;
bfs("",key,0,res,digits);
return res;
}
private void bfs(String prefix,String[] key,int idx, List<String> res,String digits){
if(idx>=digits.length()){
res.add(prefix);
}else{
String cur = key[Integer.parseInt(String.valueOf(digits.charAt(idx)))];
for(int i=0;i<cur.length();i++){
bfs(prefix+cur.charAt(i),key,idx+1,res,digits);
}
}
}
}
dfs 更正了一下,和bfs运行效率相似
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args){
String ss = "2";
Solution s = new Solution();
s.letterCombinations(ss);
}
public List<String> letterCombinations(String digits) {
String[] key = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int n = digits.length();
int[] values = new int[n];
String[] cand = new String[n];
for(int i=0;i<n;i++){
values[i] = Integer.parseInt(String.valueOf(digits.charAt(i)));
cand[i] = key[values[i]];
//if(len>0) product *= cand[i].length;
}
//String[] res = new String[product];
List<String> res = new ArrayList<String>();
res = dfs(0,cand);
return res;
}
private List<String> dfs(int index,String[] cand){
int n = cand.length;
List<String> res = new ArrayList<String>();
if(index==n) return res;
List<String> latter = dfs(index+1,cand);
for(int k=0;k<cand[index].length();k++){
String ans = "";
ans += String.valueOf(cand[index].charAt(k));
if(latter.size()==0) res.add(ans);
else{
for(String s:latter){
String end = "";
end += ans;
end += s;
res.add(end);
}
}
}
return res;
}
}
对dfs 进行更正:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args){
String ss = "2";
Solution s = new Solution();
s.letterCombinations(ss);
}
public List<String> letterCombinations(String digits) {
String[] key = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int n = digits.length();
int[] values = new int[n];
String[] cand = new String[n];
for(int i=0;i<n;i++){
values[i] = Integer.parseInt(String.valueOf(digits.charAt(i)));
cand[i] = key[values[i]];
//if(len>0) product *= cand[i].length;
}
//String[] res = new String[product];
List<String> res = new ArrayList<String>();
res = dfs(0,cand);
return res;
}
private List<String> dfs(int index,String[] cand){
int n = cand.length;
List<String> res = new ArrayList<String>();
if(index==n) return res;
List<String> latter = dfs(index+1,cand);
for(int k=0;k<cand[index].length();k++){
String ans = "";
ans += String.valueOf(cand[index].charAt(k));
if(latter.size()==0) res.add(ans);
else{
for(String s:latter){
String end = "";
end += ans;
end += s;
res.add(end);
}
}
}
return res;
}
}