一、题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
二、问题分析
根据输入字符串的条件,可以按字符串的长度进行划分。
当输入数字字符串长度为0时,返回空;
当输入数字字符串长度为1时,返回的是该数字对应的字母组合,比如输入为"9",返回[“w”, “x”, “y”, “z”],代码示例如下:
String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0;
if (digits.length() == 1) {
index0 = digits.charAt(0) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
onestr.add(Character.toString(numstr[index0].charAt(i)));
}
}
当输入数字字符串长度为2时,返回的是两个数字对应的字母全排列组合,比如输入为"67"时,字母全排列后返回为[“mp”, “mq”, “mr”, “ms”, “np”, “nq”, “nr”, “ns”, “op”, “oq”, “or”, “os”],代码示例如下:
String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0, index1;
if (digits.length() >= 2) {
index0 = digits.charAt(0) - '2';
index1 = digits.charAt(1) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
for (int j = 0; j < numstr[index1].length(); j++) {
onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
}
}
}
当输入数字字符串长度为3时,返回的是三个数字对应的字母全排列组合,代码实现时,可以采取三层循环的方式,分别循环遍历三个数字对应的字母进行全排列,但从减少圈复杂度考虑,可以取前两个数字的字母跟后一个数字的字母全排列的方式实现。
比如输入为“678“时,可以取"67"对应的排列结果,与"8"对应的字母进行二次排列组合,得到最终的结果。
当输入数字字符串长度为4时,返回的是四个数字对应的字母全排列组合,代码实现时,可以取前两个数字的字母跟后两个数字的字母全排列的方式实现。
比如输入为“6789“时,可以取"67"对应的排列结果,与"89"对应的字母进行二次排列组合,得到最终的结果。
相对应代码实现如下:
String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0, index1;
if (digits.length() >= 2) {
index0 = digits.charAt(0) - '2';
index1 = digits.charAt(1) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
for (int j = 0; j < numstr[index1].length(); j++) {
onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
}
}
}
if (digits.length() == 3) {
index0 = digits.charAt(2) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
twostr.add(Character.toString(numstr[index0].charAt(i)));
}
} else if (digits.length() == 4) {
index0 = digits.charAt(2) - '2';
index1 = digits.charAt(3) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
for (int j = 0; j < numstr[index1].length(); j++) {
twostr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
}
}
}
// 取前两个数字结果与后一个/两个数字结果进行全排列
if (digits.length() > 2) {
for (int i = 0; i < onestr.size(); i++) {
for (int j = 0; j < twostr.size(); j++) {
retstr.add(onestr.get(i) + twostr.get(j));
}
}
return retstr;
}
三、代码实现
完整代码实现如下:
static public List<String> letterCombinations(String digits) {
List<String> retstr = new ArrayList<>();
List<String> onestr = new ArrayList<>();
List<String> twostr = new ArrayList<>();
String[] numstr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int index0, index1;
if (digits.length() == 1) {
index0 = digits.charAt(0) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
onestr.add(Character.toString(numstr[index0].charAt(i)));
}
} else if (digits.length() >= 2) {
index0 = digits.charAt(0) - '2';
index1 = digits.charAt(1) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
for (int j = 0; j < numstr[index1].length(); j++) {
onestr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
}
}
}
if (digits.length() == 3) {
index0 = digits.charAt(2) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
twostr.add(Character.toString(numstr[index0].charAt(i)));
}
} else if (digits.length() == 4) {
index0 = digits.charAt(2) - '2';
index1 = digits.charAt(3) - '2';
for (int i = 0; i < numstr[index0].length(); i++) {
for (int j = 0; j < numstr[index1].length(); j++) {
twostr.add(Character.toString(numstr[index0].charAt(i)) + Character.toString(numstr[index1].charAt(j)));
}
}
}
// 取前两个数字结果与后一个/两个数字结果进行全排列
if (digits.length() > 2) {
for (int i = 0; i < onestr.size(); i++) {
for (int j = 0; j < twostr.size(); j++) {
retstr.add(onestr.get(i) + twostr.get(j));
}
}
return retstr;
}
return onestr;
}