一、原题
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
二、中文
给定一个数字串,返回数字上所有字符的所有组合,数字到字符的映射如上图所示。
注意: 尽管上面的结果以字符顺序排列的,你可以以任何顺序返回结果。
三、举例
比如数组输入的是23,那么有ad,ae,af,bd,be,bf,cd,ce,cf 等多种组合
四、思路
本来是看大神的思路,结果是没有看懂的,这个有点复杂,结果自己按照比较笨的思路来吧,也是通过一个小递归的思想,每次将两个按键上的字母想组合
五、程序
package LeetCode;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
//给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组。
public class Leetcode012 {
private static int f;
public static void main(String args[]){
List<String> list = new LinkedList<String>();
list = letterCombination("234");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+ " ");
f++;
if(f % 5 == 0){
System.out.println();
}
}
}
private static String[] map = {
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
private static char[] charArrays;
//仅在第一次执行的时候初始化list3的标志位
private static int flag = 0;
//第一次执行的时候复制list1的数组,目的值断开list1的引用关系,要不list1.clear()会清楚list1中的内容,因为是引用
private static final List<String> list3 = new LinkedList<String>();
public static List<String> letterCombination(String digits) {
//list2用来存储连接操作之后返回的数组,list1用来接收新传入的数组
List<String> list2 = new LinkedList<String>();
List<String> list1 = new LinkedList<String>();
charArrays = digits.toCharArray();
//遍历一遍,既不等于'0',也不等于'1'
for(int i = 0; i < charArrays.length; i++){
if(charArrays[i] != '0' && charArrays[i] != '1'){
//将其转换成数字
int num = charArrays[i] - '2';
char[] cies = (map[num]).toCharArray();
for(int j = 0; j < cies.length; j++){
list1.add(String.valueOf(cies[j]));
//当第一次执行的时候才将值传给list3,这样才可以保证list3中只有abc,因为是引用,要不会增加了
if(flag == 0){
list3.add(String.valueOf(cies[j]));
}
}
flag++;
//将两个字符串进行组合
list2 = combinationString(list1, list2);
}
list1.clear();
}
return list2;
}
/**
* 将两个字符串链表进行组合
* @param list1 新的需要组合的字符串链表
* @param list2 原来的字符串链表
* @return 返回一个新的字符串链表
*/
public static List<String> combinationString(List<String> list1, List<String> list2){
List<String> listTemp = new LinkedList<String>();
String[] array1 = list1.toArray(new String[list1.size()]);
String[] array2 = list2.toArray(new String[list2.size()]);
if(array2.length <= 0){
return list3;
}else{
for(int i = 0; i < array1.length; i++){
for(int j = 0; j < array2.length; j++){
listTemp.add(array1[i]+array2[j]);
}
}
}
return listTemp;
}
}
-------------------------------output---------------------------------------
gda gdb gdc gea geb
gec gfa gfb gfc hda
hdb hdc hea heb hec
hfa hfb hfc ida idb
idc iea ieb iec ifa
ifb ifc