复习 dfs 一个有待提高的版本 17. Letter Combinations of a Phone Number

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;  
    }  
      
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(Telephone Number Word Generator) Standard telephone keypads contain the digits 0 through 9. The numbers 2 through 9 each have three letters associated with them, as is indicated by the following table: Many people find it difficult to memorize phone numbers, so they use the correspondence between digits and letters to develop seven-letter words that correspond to their phone numbers. For example, a person whose telephone number is 686-2377 might use the correspondence indi- cated in the above table to develop the seven-letter word “NUMBERS.” Businesses frequently attempt to get telephone numbers that are easy for their clients to remember. If a business can advertise a simple word for its customers to dial, then no doubt the business will receive a few more calls. Each seven-letter word corresponds to exactly one seven-digit telephone number. The restaurant wishing to increase its take-home business could surely do so with the number 825-3688 (i.e., “TAKEOUT”). Each seven-digit phone number corresponds to many separate seven-letter words. Unfortunately, most of these represent unrecognizable juxtaposi- tions of letters. It’s possible, however, that the owner of a barber shop would be pleased to know that the shop’s telephone number, 424-7288, corresponds to “HAIRCUT.” A veterinarian with the phone number 738-2273 would be happy to know that the number corresponds to “PETCARE.” Write a program that, given a seven-digit number, writes to a file every possible seven-letter word corresponding to that number. There are 2187 (3 to the seventh power) such words. Avoid phone numbers with the digits 0 and 1.
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值