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

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

示例:

输入:“23”

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

说明:

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

第一种方法,纯暴力

每次都把字符加上去存到String ArrayList里,然后用两个int pos和posNow计入当前答案和之前答案的开始位置,循环利用之前答案加一位字母生成新的字符串。

import java.util.LinkedList;
import java.util.List; public class 电话号码的数字组合 {
public static void main(String[] args) { String digits="23";
List<String> ans = new LinkedList<String>();
// if(digits.isEmpty()) return ans;//注意空的情况
String sb="";
String[] numToChar = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int[] num = new int[digits.length()];
int count=1;
int now;
String check; for(int i=0;i<digits.length();i++){
num[i]=numToChar[digits.charAt(i)-'2'].length();
count*=num[i];
}
for(int i=0;i<count;i++){
now = i;
for(int j=0;j<digits.length();j++){
check =numToChar[digits.charAt(j)-'2'];
char a=check.charAt(now%num[j]);//取当前这一组eg:(abc)最大的一个
sb = sb+a;
now/=num[j];
}
ans.add(sb.toString());
// sb.delete( 0, sb.length() );//清空sb
sb="";
}
System.out.println(ans);
} }

第二种方法

原理就是将每个可能的字符串编码,然后计算出总共可能的数量。

之后遍历0~最大数量间的所有数,每一个数对应一个字符串。然后对这些数字不断取余就是每一个编码对应的每一位的字符编号。然后根据这个编号去数组里找对应字符插入StringBuilder,等编码分析完毕后,一条字符串就好了,可以插入输出StringArrayList中。

import java.util.LinkedList;
import java.util.List; public class 电话号码的数字组合2 {
static String digits="23";
public static void main(String[] args) {
List<String> ans = new LinkedList<String>();
List<String> result = new LinkedList<String>(); String[] numToChar = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int len = digits.length();
int pos=0;
int posNow=0;
for(int i=0;i<len;i++){
char c = digits.charAt(i);
if(result.size()!=0){
for(int j=pos;j<posNow;j++){
for(int k=0;k<numToChar[c-'2'].length();k++){
System.out.println(result.get(j)+numToChar[c-'2'].charAt(k));
result.add(result.get(j)+numToChar[c-'2'].charAt(k));
}
}
}
else{
for(int k=0;k<numToChar[c-'2'].length();k++){
System.out.println(""+numToChar[c-'2'].charAt(k));
result.add(""+numToChar[c-'2'].charAt(k));
}
}
pos=posNow;
posNow = result.size();
}
for(int i=pos;i<posNow;i++){
ans.add(result.get(i));
}
System.out.println(ans);
} }

Java实现LeetCode17. 电话号码的字母组合的更多相关文章

  1. Leetcode13. 罗马数字转整数Leetcode14. 最长公共前缀Leetcode15. 三数之和Leetcode16. 最接近的三数之和Leetcode17. 电话号码的字母组合

    > 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出对应整数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/63802fda72be45eba98d9e4 ...

  2. [Swift]LeetCode17. 电话号码的字母组合 | Letter Combinations of a Phone Number

    Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...

  3. LeetCode17.电话号码的字母组合 JavaScript

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  4. leetcode17 电话号码的字母组合 dfs

    就dfs吧.... 然后,我傻了.前一道题不用考虑空,这道题就要考虑.... 还有注意vector要引用传递 class Solution { public: void dfs(string temp ...

  5. Java实现 LeetCode 17 电话号码的字母组合

    17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...

  6. [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  7. lintcode 中等题:Letter Combinations of a Phone Number 电话号码的字母组合

    题目 电话号码的字母组合 给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合. 下图的手机按键图,就表示了每个数字可以代表的字母. 样例 给定 "23" 返回 [& ...

  8. LeetCode(17):电话号码的字母组合

    Medium! 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...

  9. Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    [Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...

随机推荐

  1. 安卓APP承载网页(WebView)

    安卓APP自身如何打开网页,如何制作一个简单的浏览器,WebView在其中将是一个重要的角色.WebView是一个基于WebKit引擎.展现Web页面的控件. Webview 是一个基于webkit引 ...

  2. C# 数据操作系列 - 5. EF Core 入门

    0.前言 上一章简单介绍了一下ORM框架,并手写了一个类似ORM的工具类.这一章将介绍一个在C#世界里大名鼎鼎的ORM框架--Entity Framework的Core版. Entity Framew ...

  3. void 型指针的高阶用法,你掌握了吗?

    [导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用.测试环境采用 IAR for ARM 8.40.1 什么是void指针 void指针 ...

  4. 【雕爷学编程】Arduino动手做(58)---SR04超声波传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  5. Unity2D模拟控制位移

    using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public ...

  6. 情人节闷在家里做画( 安卓统计图MPAndroidChart开发 )

    有些时候觉得一个人挺好的,可以更自由安排自己的时间: 有些时候觉得有个人挺好的,很多事情一个人做起来太没意思了,纵使心中澎湃,倾听的独有自己. 废话少说,直接上图 MPAndroidChart是啥 一 ...

  7. Vue基础:子组件抽取与父子组件通信

    在工作中承担一部分前端工作,主要使用Vue + Element UI. 随着版本迭代,需求增加,页面往往变得更加臃肿,不易维护.学习子组件的封装和抽取,能更好适应需求. 为什么需要子组件 可复用 将重 ...

  8. Node.js躬行记(1)——Buffer、流和EventEmitter

    一.Buffer Buffer是一种Node的内置类型,不需要通过require()函数额外引入.它能读取和写入二进制数据,常用于解析网络数据流.文件等. 1)创建 通过new关键字初始化Buffer ...

  9. OPCUA+MQTT构建物联网通用框架

    写在前面: 为了应对标准化和跨平台的趋势,更好的推广OPC,OPC基金会在OPCDA成功应用的基础上推出了一个新的OPC标准——OPC UA,OPCUA不再基于分布式组件对象模型(DCOM),而是以面 ...

  10. 八皇后问题求解java(回溯算法)

    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...