原题链接:
https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
思路:
输入一串0-9的数字,每个数字对应着电话上的1个或多个字符,要求出所有可能的字符组合,以List形式返回。
假设输入“23”,先取第一个字符2,对应的字符串是“abc”,那么此时的List内元素是“a”,"b","c"。再取第二个字符3,对应的字符串是“def”,那么此时List中的元素是“ad”,"ae","af","bd","be","bf","cd","ce","cf"。可以发现,输入的号码字符串里每多一个数字字符,就会取出原List中所有的元素,给每一个元素字符串加新的字符构成新的字符串然后将这个字符串加到List中,而原List中所有的元素都会消失。原List中的元素就像是一个个的根节点,输入的数字字符每多一个,每个根节点就会生成很多子节点,当子节点生成之后,就会把根节点全部去除,从而新生成的子节点变成了新的根节点可以开始下一轮循环,直到输入字符串的最后一个元素。我们可以利用队列的FIFO特性来描述这样一种关系,先入队的根节点先出队来构造子节点入队。最原始的根节点,使用空串“”。注意这样一种情况,在生成子节点的过程中会出现根节点和子节点同时在队中的情况,比如队中有“a”,"b","c",现在开始生成子节点,那么从队列中取出“a”,生成“ad”,“ae”,"af",这时"b","c",“ad”,"ae","af"同时在队中,那么只可以有“b”,"c"来作为根节点,而“ad”,"ae","af"不可以作为根节点。还有一种情况,为了方便操作,我们使用了“”作为最原始的根节点,如果输入字符串长度不为0,自然这个“”会被remove。但是如果输入字符串为长度为0,也就是根本就不会进行生成子节点的操作,“”不会被remove,所以要在开始时加一个判断,如果输入字符串长度为0,则直接返回一个空的List。
LinkedList提供了方法以支持队列的行为,并且实现了Queue接口。
offer() 将元素插到队尾或者返回false。
peek()不移除的情况下返回队头,没有队头返回null。
element()不移除的情况下返回队头,没有队头抛出异常。
poll()移除的情况下返回队头,没有队头返回null。
remove()移除的情况下返回队友,没有队头抛出异常。
iint Character.getNumericValur(char c); char到int的转换。
public List<String> letterCombinations(String digits) {
LinkedList<String> queue = new LinkedList<String>();
if (digits.length()==0){
return queue;
}
String[] map = {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
queue.add("");
for(int i=0; i<digits.length(); i++) {
int key = Character.getNumericValue(digits.charAt(i));
while(queue.peek().length() == i) {
String t = queue.remove();
for(char s: map[key].toCharArray()) {
queue.offer(t+s);
}
}
}
return queue;
}