Leetcode 17 Letter Combinations of a Phone Number 电话数字的翻译

典型的退后一步,这道题的字典的数据结构比较重要,不要因为字符长度不统一,没有数学规律,就想当然的map,还有数组呢,下坐标,哈哈

题目:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:

尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

解决办法,比较笨的数据结构:

public List<String> letterCombinations(String digits)
	{
		List<String> ret = new ArrayList<String>();
		char[]arr=digits.toCharArray();
		if(digits.length()==0){			
			return ret;
		}
		Map<String,List<String>> map= new HashMap<String,List<String>>();
		
		List<String> l1=new ArrayList<String>();
		l1.add("a");
		l1.add("b");
		l1.add("c");
		map.put("2", l1);
		List<String> l2=new ArrayList<String>();
		l2.add("d");
		l2.add("e");
		l2.add("f");
		map.put("3", l2);
		List<String> l3=new ArrayList<String>();
		l3.add("g");
		l3.add("h");
		l3.add("i");
		map.put("4", l3);
		List<String> l4=new ArrayList<String>();
		l4.add("j");
		l4.add("k");
		l4.add("l");
		map.put("5", l4);
		List<String> l5=new ArrayList<String>();
		l5.add("m");
		l5.add("n");
		l5.add("o");
		map.put("6", l5);
		
		List<String> l6=new ArrayList<String>();
		l6.add("p");
		l6.add("q");
		l6.add("r");
		l6.add("s");
		map.put("7", l6);
		List<String> l7=new ArrayList<String>();
		l7.add("t");
		l7.add("u");
		l7.add("v");
		map.put("8", l7);
		List<String> l8=new ArrayList<String>();
		l8.add("w");
		l8.add("x");
		l8.add("y");
		l8.add("z");
		map.put("9", l8);
		
		String s="";
		dpTree(arr,0,map,ret,s);
		
		return ret;
	}
	public void dpTree(char[]arr,int level,Map<String,List<String>> map,List<String> ret,String str){
		if(level==arr.length){
			ret.add(str);
			return;
		}
		String k=String.valueOf(arr[level]);
		List<String> list=map.get(k);
		for(int i=0;i<list.size();i++){
			String s=str+list.get(i);
			dpTree(arr,level+1,map,ret,s);
		}
	}

好的字典:

private static final String[] DICTIONARY = {
            " ",
            "",
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz",

    };

    static List<String> res = new ArrayList<>();

    public List<String> letterCombinations(String digits) {
        if(digits == null || digits.equals("")){
            return res;
        }
        
        res.clear();

        doCombination(digits, 0, "");
        return res;
    }

    private void doCombination(String digits, int index, String s) {
        if(index == digits.length()){
            res.add(s);
            return;
        }

        char current = digits.charAt(index);

        String tmp = DICTIONARY[current - '0'];
        
        for(int i = 0; i < tmp.length(); i++){
            doCombination(digits, index + 1, s + tmp.charAt(i));
        }
    }

哈哈


猜你喜欢

转载自blog.csdn.net/ata_123/article/details/80914444