给定一个仅包含数字 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程序员资料,自取哦!!