給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。
給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。
示例:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
說明:
儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。
歐克歐克,說實話最近刷題很少了,再刷那個慕課網的Java就業班,
其實吧我刷那個班有點遲了,最好剛學完Java的大學生暑假寒假刷,我這畢業了有點遲咯。
不過意識到遲的時候也是最適合開始的時候。不是嘛?
這道題目,我拿到的時候吧。左思右想我覺得就是個很隨意的窮舉法,不過效率太低了。
在這邊給大家列一下吧。就是如果輸入的字符串不爲空的話,我們從map中找到對應的字符。
然後挨個的和list中的元素增加就好啦
public class letter {
public List<String> letterCombinations(String digits) {
if(digits.isEmpty())
return null;
Map<Integer,String> m=new HashMap<>();
m.put(2, "abc");
m.put(3, "def");
m.put(4, "ghi");
m.put(5, "jkl");
m.put(6, "mno");
m.put(7, "pqrs");
m.put(8, "tuv");
m.put(9, "wxyz");
int[] dig=new int[digits.length()];
for(int i=0;i<dig.length;i++){
dig[i]=new Integer(digits.substring(i, i+1));
}
List<String> s=new ArrayList<String>();
String s1=m.get(dig[0]);
for(String temp:s1.split(""))
s.add(temp);//初始化下list
for(int i=1;i<dig.length;i++){
s=fuck(s,m.get(dig[i]));//窮舉法
}
return s;
}
private List<String> fuck(List<String> s, String string) {
List<String> s2=new ArrayList<String>();
for(int i=0;i<s.size();i++){
for(int k=0;k<string.length();k++){
s2.add(s.get(i)+string.substring(k, k+1));//真正邏輯也不是很難吧
}
}
return s2;
}
public static void main(String[] args) {
letter l=new letter();
List<String> list=l.letterCombinations("235");
for(String ll:list){
System.out.println(ll);
}
}
}
歐克歐克,爲了學習,我們來看下別人的題解,想想他們的思路
他們的思路很清奇無暇,運用迭代的方式去操作
okok,就是想想每個數字是一個節點,他有三條或者4條分支,問從根節點到葉節點一共有多少路,並用list保存每條路的信息
代碼如下
class Solution {
private ArrayList<String> res;
Map<Integer,String> m1=new HashMap<Integer, String>();
public List<String> letterCombinations(String digits) {
m1.put(2, "abc");
m1.put(3, "def");
m1.put(4, "ghi");
m1.put(5, "jkl");
m1.put(6, "mno");
m1.put(7, "pqrs");
m1.put(8, "tuv");
m1.put(9, "wxyz");
res=new ArrayList<String>();
if(digits.equals(""))
return res;
findCombination(digits,0,"");
return res;
}
private void findCombination(String digits, int i, String str) {
if(i==digits.length()){
res.add(str);
return;
}
Character c=digits.charAt(i);
String letters=m1.get(c-'0');
for(int j=0;j<letters.length();j++){
findCombination(digits, i+1, str+letters.charAt(j));
}
}
}
最後宣傳下我個人的微信公衆號,微信搜索:可及的小屋,有志向整副業,娛樂的程序員們,歡迎您的到來。謝謝。
100G程序員資料,自取哦!!