1. 程式人生 > >LeetCode刷題Medium篇Letter Combinations of a Phone Number

LeetCode刷題Medium篇Letter Combinations of a Phone Number

題目

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

十分鐘嘗試

做過排序組合的題目,用的回溯法,但是回溯法掌握的不熟練。用兩層for迴圈?先儲存數字和字元的對映關係?感覺有些複雜。應該有更好的方法。看了一下解法,主要思路:

1 用佇列儲存上一次的遍歷結果,當佇列裡面元素長度不等於數字長度,表示沒有遍歷完全,繼續

2 每次遍歷過程中,入隊的元素先進先出,所以層與層之間,如果這層處理完,remove增加才會處理下一層

class Solution {
    public List<String> letterCombinations(String digits) {
        LinkedList<String> res = new LinkedList<String>();
		if(digits.isEmpty()) return res;
		String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        //新增一個空元素,保證第一個字串入隊
        res.add("");
        while(res.peek().length()!=digits.length()){
            String removed=res.remove();
            String toAddElement=mapping[digits.charAt(removed.length())-'0'];
            for(char ch:toAddElement.toCharArray()){
                res.addLast(removed+ch);
            }
        }
        return res;
    }
}

 

我們修改一下這個題目,這個題目本身就是求下面的問題:

一個字串陣列[“abc”,“def”] 輸出所有的可能的排列組合。其實是一樣的,比如題目給定數字23,2對應abc,3對應def。就是求abc和def的所有的排列組合

 我們用剛剛學習到的BFS思路學習解決一下。這樣,這個思路就比較通用。看下面成功的程式碼, 所以我可以試圖解決其他排列組合的問題,包括之前用回溯法解法的問題,回溯法不太容易理解,可以考慮用BFS的這個思路解決,很不錯,先看字串的排列組合解法

package com.puhui.goosecard.manage;

import java.util.LinkedList;
import java.util.List;

/**
 * 2 * @Author: kerry
 * 3 * @Date: 2018/12/7 10:18
 * 4
 */
public class Test {

    public static List<String> letterCombinations(String[] inputs) {
        LinkedList<String> res = new LinkedList<String>();
        if (inputs.length == 0) {
            return res;
        }
        res.add("");
        //最後排列組合的每個元素長度和輸入的字元長度一樣,所以可以判斷
        while (res.peek().length() != inputs.length) {
            String remove = res.remove();
            String toAddQueue = inputs[remove.length()];
            for (char c : toAddQueue.toCharArray()) {
                res.addLast(remove + c);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String[] inputs = {"abc", "def", "kfg"};
        System.out.println(letterCombinations(inputs));

    }
}

數字也可以,所以我們發現了一種解決排列組合問題的新思路:

package com.puhui.goosecard.manage;

import java.util.LinkedList;
import java.util.List;

/**
 * 2 * @Author: kerry
 * 3 * @Date: 2018/12/7 10:18
 * 4
 */
public class Test {

    public static List<String> letterCombinations(String[] inputs) {
        LinkedList<String> res = new LinkedList<String>();
        if (inputs.length == 0) {
            return res;
        }
        res.add("");
        //最後排列組合的每個元素長度和輸入的字元長度一樣,所以可以判斷
        while (res.peek().length() != inputs.length) {
            String remove = res.remove();
            String toAddQueue = inputs[remove.length()];
            for (char c : toAddQueue.toCharArray()) {
                res.addLast(remove + c);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String[] inputs = {"23", "16", "54"};
        System.out.println(letterCombinations(inputs));

    }
}