力扣LeetCode17、電話號碼的字母組合,解題思路的來源

給定一個僅包含數字 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程序員資料,自取哦!!
可及的小屋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章