leetcode17.电话号码的字母组合——学习笔记

题目:力扣icon-default.png?t=L9C2https://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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hokachi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值