給定一個數字串,返回數字上全部字符的全部組合,數字到字符的映射如上圖所示。
注意: 儘管上面的結果以字符順序排列的,你能夠以任何順序返回結果。java
用一個數組保存數字和字的映射關係,根據數字串的輸入,找到對應的字符,組合結果。git
public class Solution { private String[] map = { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", }; private List<String> result; // 存儲最終結果 private char[] chars; // 保存去掉0,1字符的結果 private char[] curResult; // 存儲中間結果 private int end = 0; // 字符數組中的第一個未使用的位置 private int handle = 0; // 當前處理的是第幾個字符數字 public List<String> letterCombinations(String digits) { result = new LinkedList<>(); if (digits != null && digits.length() > 0) { chars = digits.toCharArray(); // 對字符串進行處理,去掉0和1 // 找第一個0或者1的位置 while (end < digits.length() && chars[end] != '0' && chars[end] != '1') { end++; } handle = end + 1; while (handle < chars.length) { if (chars[handle] != '0' && chars[handle] != '1') { chars[end] = chars[handle]; end++; } handle++; } curResult = new char[end]; // while結束後,end爲有效字符的長度 handle = 0; // 指向第一個有效字符的位置 letterCombinations(); } return result; } private void letterCombinations() { if (handle >= end) { result.add(new String(curResult)); } else { int num = chars[handle] - '2'; for (int i = 0; i < map[num].length(); i++) { curResult[handle] = map[num].charAt(i); handle++; letterCombinations(); handle--; } } } }
問題:數組
電話的號碼盤通常能夠用於輸入字母,如用2能夠輸入a,b,c,用3能夠輸入d,e,f等。app
對於號碼5869872,能夠依次輸出其表明的全部字母組合。如:jtmwtpa,jtmwtpb.........spa
一、您可否能夠根據這樣的對應關係設計一個程序,儘量快地從這些字母組合中找到一個有意義的單詞來描述一個電話號碼呢?如:能夠用單詞「computer」來描述號碼26678837。.net
分析與解法:設計
對於問題1,不妨掏出電話來研究,咱們能夠發現,除了0,1以外,其餘數字上最少都有3個字符,其中7和9上有4個字符,咱們能夠假設0,1都是空字符。code
首先講問題簡單化,若電話號碼只有一位數,好比說4,那麼其表明的單詞爲g,h,i,據此能夠畫出一顆排列樹,以下:blog
接着若電話號碼升級到兩位數,好比42,又將如何呢?分兩步走,從左到右,在選擇一個第一位數字所表明的字符的基礎上,遍歷第二位數字所表明的字符,直到遍歷完第一位數字表明的全部字符。就拿42來講,4所能表明的字符爲ghi,2所能表明的字符爲abc,首先讓4表明g,接着遍歷2所能表明的全部字符,便可獲得ga,gb,gc,而後再讓4表明h,再次遍歷2所能表明的全部字符,便可獲得ha,hb,hc,最後讓4表明i,那麼同理可獲得ia,ib,ic.遞歸
如圖
問題1的解法:
將各個數字所能表明的字符存儲在一個二維數組中,其中0,1所表明的字符爲空字符,
char[][] c={{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
並將各個數字所能表明的字符總數記錄於另外一個數組中:
int[] total = {0,0,3,3,3,3,3,4,3,4};
用一個數組存儲電話號碼:
int[tellength] number;
將數字目前所表明的字符在其所能表明的字符集中的位置用一個數組存儲起來:
int[tellength] answer;
舉個例子,若number[0]=4,即電話號碼的第一位爲4,若answer[0]=2,即4目前表明的字符爲:
c[number[0]][answer[0]]=c[4][2] = 'i';
問題1的遞歸解法以下:
[java] view plain copy