【算法题】电话号码的字母组合

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述
示例

输入: “23”
输出: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

思路

  • 首先,要对输入做非空判断,如果输入是空字符串,则直接将未赋值的List< String > 返回。笔者在开始做的时候返回的是null,这个是不对的,应该是空的List< String >集合才对。
  • 在遍历数字字符的过程之前,要对集合的长度进行判断,防止首次遍历时集合结果为空,导致始终无法进入循环。
  • 不要使用foreach()进行遍历,因为foreach遍历的过程中,因为遍历过程中集合的长度在不断增加,这样遍历会无法终止,最终导致内存不足错误。也不要在使用for()循环时将遍历条件设置为类似i < list.size()的形式,道理无异。
  • 在每次遍历结束后,要将集合之前的元素清除掉。可以采用每次都清理集合第一个元素,这样每次清理之后集合第二个元素自动填补到第一个位置,清理集合起始大小的次数即可。

代码

public class Q017_letterCombinations {
 
 List<String> result = new ArrayList<>();
 
    public List<String> letterCombinations(String digits) {
     
     char[] charArr = digits.toCharArray();
     int length = charArr.length;
     if(length == 0 ) return result;
     
     for(int i = 0; i < length; i++){
      traverse(result, charArr[i] - '0');
     }
     
     return result;
    }
    
    public List<String> traverse(List<String> result, int num){
     int size = result.size();
     if(num == 2){
      if(size == 0){
       result.add("a");
          result.add("b");
          result.add("c");
          return result;
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "a");
          result.add(s + "b");
          result.add(s + "c");
         }
     }
     if(num == 3){
      if(size == 0){
       result.add("d");
          result.add("e");
          result.add("f");
          return result;
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "d");
          result.add(s + "e");
          result.add(s + "f");
         }
     }
     if(num == 4){
      if(size == 0){
       result.add("g");
          result.add("h");
          result.add("i");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "g");
          result.add(s + "h");
          result.add(s + "i");
         }
     }
     if(num == 5){
      if(size == 0){
       result.add("j");
          result.add("k");
          result.add("l");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "j");
          result.add(s + "k");
          result.add(s + "l");
         }
     }
     if(num == 6){
      if(size == 0){
       result.add("m");
          result.add("n");
          result.add("o");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "m");
          result.add(s + "n");
          result.add(s + "o");
         }
     }
     if(num == 7){
      if(size == 0){
       result.add("p");
          result.add("q");
          result.add("r");
          result.add("s");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "p");
          result.add(s + "q");
          result.add(s + "r");
          result.add(s + "s");
         }
     }
     if(num == 8){
      if(size == 0){
       result.add("t");
          result.add("u");
          result.add("v");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "t");
          result.add(s + "u");
          result.add(s + "v");
         }
     }
     if(num == 9){
      if(size == 0){
       result.add("w");
          result.add("x");
          result.add("y");
          result.add("z");
      }
      for(int i = 0; i < size; i++){
       String s = result.get(i);
          result.add(s + "w");
          result.add(s + "x");
          result.add(s + "y");
          result.add(s + "z");
         }
     }
     for(int i = 0; i < size; i++){
   result.remove(0);
  }
  return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值