17. 电话号码的字母组合

125 阅读1分钟

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

解法:

p1:回溯(循环递归)

 //回溯(循环递归)
    String[] letter_map = {" ", "*", "abc", "def", "ghi", "jkl", "mno","pqrs", "tuv","wxyz"};
    List<String> ans = new ArrayList<>();
    public List<String> letterCombinations1(String digits) {
        if(digits == null || digits.length() == 0){
            return new ArrayList<String>();
        }
        iterStr(digits, "", 0);  //递归函数
        return ans;
    }

    //不能为static
    public void iterStr(String digits, String letter, int index){
        if(index == digits.length()){  //边界条件
            ans.add(letter); //循环到末尾,加入结果列表
            return;
        }

        char c = digits.charAt(index);  //定位到digits[i],即找到目前应该遍历那个数字包含的字母
        int pos = c - '0';   //找到数字在数组中位置
        String str = letter_map[pos];  //"abc" 或 “def”等

        for(int i = 0; i < str.length(); i++){ //开始循环遍历“def”
            iterStr(digits, letter+str.charAt(i), index+1);
        }

    }

p2: 队列表示

将第一位置的字符加入队列,然后取出之后加入下一个位置的字符组合之后再加入队列,循环

//队列表示
    public List<String> letterCombinations(String digits){
        if(digits == null || digits.length() == 0){
            return new ArrayList<String>();
        }
        //Queue<String> queue = new LinkedList<>();
        //直接用list就可以
        List<String> queue = new ArrayList<>();
        queue.add("");

        //三层循环,第一层循环digits,第二层循环队列大小size, 第三层循环当前字符串中每一个字符选一个
        for(int k = 0; k < digits.length(); k++){
            int size = queue.size();
            char c = digits.charAt(k);
            int pos = c - '0';
            String str = letter_map[pos];
            for(int i = 0; i < size; i++){
                String s = queue.remove(0); //注意remove(0)
                for(int j = 0; j < str.length(); j++){
                    
                    queue.add(s+str.charAt(j)); 
                }
            }
            
        }
        return queue;
    }