题目:力扣https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
class Solution {
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<String>();
String[] str= {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char[] num = digits.toCharArray();
int[] nums = new int[num.length];
for(int a=0;a<num.length;a++){
if(num[a]!='2'&&num[a]!='3'&&num[a]!='4'&&num[a]!='5'&&num[a]!='6'&&num[a]!='7'&&num[a]!='8'&&num[a]!='9'){
continue;
}
nums[a] = (int)num[a];
}
String[] targets = new String[num.length];
for(int i=0;i<nums.length;i++){
targets[i] = str[nums[i]-50];
}
switch(num.length){
case 1:
for(int j=0;j<targets[0].length();j++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
ans.add(strr.toString());
}
break;
case 2:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
ans.add(strr.toString());
}
}
break;
case 3:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
for(int l=0;l<targets[2].length();l++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
strr.append(String.valueOf(targets[2].charAt(l)));
ans.add(strr.toString());
}
}
}
break;
case 4:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
for(int l=0;l<targets[2].length();l++){
for(int m=0;m<targets[3].length();m++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
strr.append(String.valueOf(targets[2].charAt(l)));
strr.append(String.valueOf(targets[3].charAt(m)));
ans.add(strr.toString());
}
}
}
}
break;
}
return ans;
}
}
思路:用一个String数组存储对应数字的字母(例:2—>abc),用int数组存储digits的各个数字。然后根据传入的各个数字再找到该数字对应的整串字符串,接着枚举该种字母组合,最后统一放在list中,返回即可。
1.准备阶段。声明ans,ans时最后存放答案的变量;声明String类型数组str[],用于存储各个数字对应的字母;声明char类型数组num[],用于分别存储digits分开的各个元素(数字);声明int类型数组nums[],因为digits时String类型传入,toCharArray()之后只能时char类型,需要通过num[]过度一下,再将其转为int类型存储在nums[]里(值得注意的是:强制转换后的直接输出的是数字对应的ASCII码,为使其与原本的数字一致应该减去48,然后因为输出的数字与str[]下标应该相差2,所以应该再减去2,因此最后是(int)num[a]-50。)声明String类型的数组targets[],用于存储digits所提到的各个数字所对应的字符串,以便于后续操作。
List<String> ans = new ArrayList<String>();
String[] str= {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char[] num = digits.toCharArray();
int[] nums = new int[num.length];
for(int a=0;a<num.length;a++){
if(num[a]!='2'&&num[a]!='3'&&num[a]!='4'&&num[a]!='5'&&num[a]!='6'&&num[a]!='7'&&num[a]!='8'&&num[a]!='9'){
continue;
}
nums[a] = (int)num[a]-50;
}
String[] targets = new String[num.length];
for(int i=0;i<nums.length;i++){
targets[i] = str[nums[i]];
}
2.枚举所有的字母组合。因为不能确定到底有多少个数字,因此需要分类讨论,若有1个数字则只需一层循环,若有2个数字则需要两层循环,以此类推,此处用switch处理。用for循环实现枚举的操作。因为题目给定letterCombinations的类型是List<string>类型的,因此无法用二维实现,所以此处需要一个StringBuilder类型strr来过渡一下。声明strr后,将不同target数组中的字符(target数组是String类型的,但经过.toCharArray()操作后则变为char类型)一个一个的放入strr中,最后将StringBuilder类型通过.toString()方法转化为String类型,再将其添加到List中。
switch(num.length){
case 1:
for(int j=0;j<targets[0].length();j++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
ans.add(strr.toString());
}
break;
case 2:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
ans.add(strr.toString());
}
}
break;
case 3:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
for(int l=0;l<targets[2].length();l++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
strr.append(String.valueOf(targets[2].charAt(l)));
ans.add(strr.toString());
}
}
}
break;
case 4:
for(int j=0;j<targets[0].length();j++){
for(int k=0;k<targets[1].length();k++){
for(int l=0;l<targets[2].length();l++){
for(int m=0;m<targets[3].length();m++){
StringBuilder strr = new StringBuilder();
strr.append(String.valueOf(targets[0].charAt(j)));
strr.append(String.valueOf(targets[1].charAt(k)));
strr.append(String.valueOf(targets[2].charAt(l)));
strr.append(String.valueOf(targets[3].charAt(m)));
ans.add(strr.toString());
}
}
}
}
break;
}
3.最后只需要返回ans即可。
return ans;