题目地址:17. 电话号码的字母组合
这题有点难到我,每次遇到一个数字就判断一下循环?显然过于冗余,那就想到将每个数字对应的字母放进集合,想到键值对存储,但一个键对应的值又不止一个,那就用一个数组存储,之后再循环取值。用到了递归:
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<String> letterCombinations(String digits) {
List<String> chs = new ArrayList<>();
//s数组存储数字对应的字母
String []s = new String[digits.length()];
int len = digits.length();
//如果数组对应的长度为0,说明字符串长度为0,直接返回空集合
if (s.length == 0)
return chs;
//一个数组s,每个位置读到数后存取对应字母
for (int i = 0; i < len; i++) {
switch (digits.charAt(i)){
case '2':s[i]="abc";break;
case '3':s[i]="def";break;
case '4':s[i]="ghi";break;
case '5':s[i]="jkl";break;
case '6':s[i]="mno";break;
case '7':s[i]="pqrs";break;
case '8':s[i]="tuv";break;
case '9':s[i]="wxyz";break;
}
}
chs = getStringWithFor(s,0,chs,"");
return chs;
}
private static List<String> getStringWithFor(String[] s, int i, List<String> chs, String s1) {
//采取递归的方式直到i走到倒数第二位开始
if (i < s.length-1){
for (int j = 0; j < s[i].length(); j++) {
chs = getStringWithFor(s,i+1,chs,s1+s[i].charAt(j));
}
}else{
for (int j = 0; j < s[i].length(); j++) {
chs.add(s1+s[i].charAt(j));
}
}
return chs;
}
}
结果:
感谢评论区大佬,学到了!