给定一个数字串,返回数字上全部字符的全部组合,数字到字符的映射如上图所示。
注意: 尽管上面的结果以字符顺序排列的,你能够以任何顺序返回结果。java
用一个数组保存数字和字的映射关系,根据数字串的输入,找到对应的字符,组合结果。git
public class Solution { private String[] map = { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", }; private List<String> result; // 存储最终结果 private char[] chars; // 保存去掉0,1字符的结果 private char[] curResult; // 存储中间结果 private int end = 0; // 字符数组中的第一个未使用的位置 private int handle = 0; // 当前处理的是第几个字符数字 public List<String> letterCombinations(String digits) { result = new LinkedList<>(); if (digits != null && digits.length() > 0) { chars = digits.toCharArray(); // 对字符串进行处理,去掉0和1 // 找第一个0或者1的位置 while (end < digits.length() && chars[end] != '0' && chars[end] != '1') { end++; } handle = end + 1; while (handle < chars.length) { if (chars[handle] != '0' && chars[handle] != '1') { chars[end] = chars[handle]; end++; } handle++; } curResult = new char[end]; // while结束后,end为有效字符的长度 handle = 0; // 指向第一个有效字符的位置 letterCombinations(); } return result; } private void letterCombinations() { if (handle >= end) { result.add(new String(curResult)); } else { int num = chars[handle] - '2'; for (int i = 0; i < map[num].length(); i++) { curResult[handle] = map[num].charAt(i); handle++; letterCombinations(); handle--; } } } }
问题:数组
电话的号码盘通常能够用于输入字母,如用2能够输入a,b,c,用3能够输入d,e,f等。app
对于号码5869872,能够依次输出其表明的全部字母组合。如:jtmwtpa,jtmwtpb.........spa
一、您可否能够根据这样的对应关系设计一个程序,尽量快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:能够用单词“computer”来描述号码26678837。.net
分析与解法:设计
对于问题1,不妨掏出电话来研究,咱们能够发现,除了0,1以外,其余数字上最少都有3个字符,其中7和9上有4个字符,咱们能够假设0,1都是空字符。code
首先讲问题简单化,若电话号码只有一位数,好比说4,那么其表明的单词为g,h,i,据此能够画出一颗排列树,以下:blog
接着若电话号码升级到两位数,好比42,又将如何呢?分两步走,从左到右,在选择一个第一位数字所表明的字符的基础上,遍历第二位数字所表明的字符,直到遍历完第一位数字表明的全部字符。就拿42来讲,4所能表明的字符为ghi,2所能表明的字符为abc,首先让4表明g,接着遍历2所能表明的全部字符,便可获得ga,gb,gc,而后再让4表明h,再次遍历2所能表明的全部字符,便可获得ha,hb,hc,最后让4表明i,那么同理可获得ia,ib,ic.递归
如图
问题1的解法:
将各个数字所能表明的字符存储在一个二维数组中,其中0,1所表明的字符为空字符,
char[][] c={{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
并将各个数字所能表明的字符总数记录于另外一个数组中:
int[] total = {0,0,3,3,3,3,3,4,3,4};
用一个数组存储电话号码:
int[tellength] number;
将数字目前所表明的字符在其所能表明的字符集中的位置用一个数组存储起来:
int[tellength] answer;
举个例子,若number[0]=4,即电话号码的第一位为4,若answer[0]=2,即4目前表明的字符为:
c[number[0]][answer[0]]=c[4][2] = 'i';
问题1的递归解法以下:
[java] view plain copy