Leet Code 17 电话号码的字母组合

问题原始链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number

给定一个数字字符串,返回这个数能表示的所有的字母组合。

数字与字母的关系(像电话按钮)如下所示。

例子:

输入: 数字字符串 "23"
输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

 

public class Solution {
  private static String[][] digitToStr = { { " " }, {}, { "a", "b", "c" },
      { "d", "e", "f" }, { "g", "h", "i" }, { "j", "k", "l" },
      { "m", "n", "o" }, { "p", "q", "r", "s" }, { "t", "u", "v" },
      { "w", "x", "y", "z" }, { "*" }, { "#" } };

  public static List<String> letterCombinations(String digits) {
    if (digits == null || digits.length() == 0) {
      return new ArrayList<String>();
    }

    List<StringBuilder> sbs = new ArrayList<StringBuilder>();
    for (int i = 0; i < digits.length(); i++) {
      char c = digits.charAt(i);
      if (!Character.isDigit(c) && c != '*' && c != '#') {
        continue;
      }
      int index = Character.isDigit(c) ? Character.getNumericValue(c)
          : c == '*' ? 10 : 11;
      String[] str = digitToStr[index];
      if (sbs.isEmpty()) {
        for (int j = 0; j < str.length; j++) {
          StringBuilder sb = new StringBuilder();
          sbs.add(sb);
          sb.append(str[j]);
        }
      } else {
        int l = sbs.size();
        for (int k = 0; k < l; k++) {
          sbs.get(k).append(str[0]);
        }
        for (int j = 1; j < str.length; j++) {
          for (int k = 0; k < l; k++) {
            StringBuilder sb = new StringBuilder().append(sbs.get(k));
            sbs.add(sb);
            sb.setCharAt(sb.length() - 1, str[j].charAt(0));
          }
        }
      }
    }

    List<String> result = new ArrayList<String>(sbs.size());
    for (int i = 0; i < sbs.size(); i++) {
      result.add(sbs.get(i).toString());
    }
    return result;
  }

}

 

转载于:https://my.oschina.net/mistymarch/blog/688655

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值