leetcode-17 力扣 java版本

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

 public List<String> letterCombinations(String digits) {
    /**
     * 开始都会判断是否满足要求,不满足直接返回
     * 本题难点在与怎么判断自由组合字母,运用了递归来解决几个
     * 字母对应的字符自由组合,递归本来就对我们来说很难理解
     */
    if (digits == null || digits.length() == 0) {
      return new ArrayList();
    }
    Map<Integer,String> map = new HashMap<>();
    //这用map集合最合适存储对用的规则
    List<String> list = new ArrayList<>();
    map.put(2,"abc");
    map.put(3,"def");
    map.put(4,"ghi");
    map.put(5,"jkl");
    map.put(6,"mno");
    map.put(7,"pqrs");
    map.put(8,"tuv");
    map.put(9,"wxyz");
    //申请个arr来存与digits数字对应的字符串
    String[] arr = new String[digits.length()];
    for (int i=0;i<digits.length();i++) {
      //这注意Integer 与String的转换还有int,满足就存入arr里
      if (map.containsKey(Integer.parseInt(digits.substring(i, i + 1)))) {
        arr[i] = map.get((Integer.parseInt(digits.substring(i, i + 1))));
      }
    }
    //调用方法来递归存储遍历传入s临时保存组合的字符串,k来控制arr个数,list来存所有的组合
    lookString("",0,list,arr);
    return list;
  }
  public static void lookString(String s, int k, List<String> list, String[] arr) {
    //3.终止条件到arr.length说明到最后了
    if (k==arr.length) {
      //s由s+letters.charAt(j)叠加来第一个元素的组合比如23对应abc,def中的ad返回到下面for循环
      //就变成a先与arr[1]对应的def循环在返还上次变成b与def循环下去返回
      list.add(s);
      return;
    }
    //1.首先定义arr里的那个用k来控制
    String letters = arr[k];
    //其次遍历这个k对应得字符
    for (int j=0;j<letters.length();j++) {
      /**
       * 2
       *递归调用这个letter的k对应的下个arr[k],s开始为0,递归第一次s就变为arr对应的j值
       *k增加往后移
       */
      lookString(s+letters.charAt(j),k+1,list,arr);
    }
  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值