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