17. Letter Combinations of a Phone Number

集合类的,一看就是back track

只不过子集需要规定一下。

然后好在没有1 0 什么的。。简单了很多

public class Solution {
    public List<String> letterCombinations(String digits) 
    {
        List<String> res = new ArrayList<>();
        if(digits.length() == 0) return res;
        Map<Integer,List<Character>> map = new HashMap<Integer,List<Character>>();
        for(char i = '2'; i <= '9';i++) map.put(i - '0',new ArrayList<Character>());
        map.get(2).add('a');map.get(2).add('b');map.get(2).add('c');
        map.get(3).add('d');map.get(3).add('e');map.get(3).add('f');
        map.get(4).add('g');map.get(4).add('h');map.get(4).add('i');
        map.get(5).add('j');map.get(5).add('k');map.get(5).add('l');
        map.get(6).add('m');map.get(6).add('n');map.get(6).add('o');
        map.get(7).add('p');map.get(7).add('q');map.get(7).add('r');map.get(7).add('s');
        map.get(8).add('t');map.get(8).add('u');map.get(8).add('v');
        map.get(9).add('w');map.get(9).add('x');map.get(9).add('y');map.get(9).add('z');
        
        
        
        helper(res,digits,map,new String(),0);

        return res;    
    }
    
    public void helper(List<String> res, String digits, Map<Integer,List<Character>> map, String tempStr,int m)
    {
        if(m == digits.length())
        {
            res.add(tempStr);
        }
        else
        {
            
                char tempCh = digits.charAt(m);
                List<Character> letterList = map.get(tempCh - '0');
                for(int j = 0; j < letterList.size();j++)
                {
                    
                    helper(res,digits,map,tempStr + Character.toString(letterList.get(j)),m+1);

                }
            
        }
    }
    
    
}

我居然蠢到用MAP来规定可用字母。

其实完全可以String[] = new String[9];
String[2] = "abc"
String[3] = "def"
...

甚至String[] cao = {"","abc","def"...}

BACK TRACK没啥可说的。。



三刷。

只有数字的话简单多了,没那些乱七八糟的。

DFS。。

复杂度:

Time: O(3^n)
Space: O(n)

public class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> res = new ArrayList<>();
        if (digits.length() == 0) return res;
        String[] strs = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        dfs(res, strs, digits, new String());
        return res;
    }
    
    public void dfs(List<String> res, String[] strs, String s, String tempS) {
        if (s.length() == 0) {
            res.add(tempS);
            return;
        } else {
            String letter = strs[s.charAt(0) - '0'];
            for (int i = 0; i < letter.length(); i++) {
                dfs(res, strs, s.substring(1), tempS + letter.charAt(i));
            }
        }
    }
}
posted @ 2016-11-08 12:29  哇呀呀..生气啦~  阅读(99)  评论(0)    收藏  举报