Leetcode第17題。
數字2-9映射字母,給出一個包含字符串的數字,列出字母的全部組合。
java
拿到這樣的題目想到了遞歸實現,建立一個Map映射對應的字母,而後把它傳給遞歸函數,同時建立一個臨時變量temp,保存每一次添加字母的結果,遞歸的結束條件是數字串的長度爲0.git
public void one(String digits,List<String> result,HashMap<Integer,String> ss,String temp) { if(digits.length() > 0) { String s = ss.get((int)(digits.charAt(0))-48); for(int i=0;i<s.length();++i) one(digits.substring(1),result,ss,temp+s.charAt(i)); } else result.add(temp); }
直接一次AC.github
其實能夠不須要Map的,能夠直接使用一個字符串數組,由於是數字到字符串的映射,對於數字能夠用下標代替。其次,爲了更快的速度能夠使用StringBuilder代替String.數組
還有就是用下標代替了截斷digits,對於digits其實不必使用截斷,只須要一個下標表示範圍便可,對於StringBuilder,由於沒有像String這樣的+,所以須要在使用append後對其進行刪除處理。app
public void one(String digits,int index,StringBuilder temp) { if(index < digits.length()) { String d = s[digits.charAt(index)-'0']; for(int i=0;i<d.length();++i) { one(digits,index+1,temp.append(d.charAt(i))); temp.deleteCharAt(index); } } else result.add(temp.toString()); }
github函數
碼雲優化