给定一个仅包含数字 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. [zoj3632]线段树的应用

    题意:f[i] = min(f[i+L]~f[i+R]) + x,计算f数组.从大到小计算即可,用线段树维护一下. #pragma comment(linker, "/STACK:10240 ...

  2. Android fragment 使用replace并保存状态

    Fragment的地位在开发中可是举足轻重的,掌握它的的生命周期以及使用特性是非常重要的,例如在开发中常使用的模板: 点击菜单,中心内容跟随菜单变化,但是在菜单间切换时,需要保存之前输入的信息或其他状 ...

  3. JS的IIFE

    1. 定义 IIFE: Immediately Invoked Function Expression,意为立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数. 首先我们要了解一般情况下什 ...

  4. 从X86指令深扒JVM的位移操作

    概述 之所以会写这个,主要是因为最近做的一个项目碰到了一个移位的问题,因为位移操作溢出导致结果不准确,本来可以点到为止,问题也能很快解决,但是不痛不痒的感觉着实让人不爽,于是深扒了下个中细节,直到看到 ...

  5. 1.3Go环境搭建之Windows

    1.1.2. Golang SDK SDK 的全称(Software Development Kit 软件开发工具包) 2) SDK是提供给开发人员使用的,其中包含了对应开发语言的工具包 1.1.3. ...

  6. How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server

    http://www.acunetix.com/blog/web-security-zone/articles/slow-http-dos-attacks-mitigate-apache-http-s ...

  7. 201771010120 苏浪浪 面向对象程序设计(Java)第10周

      1.实验目的与要求 (1) 理解泛型概念: (2) 掌握泛型类的定义与使用: (3) 掌握泛型方法的声明与使用: (4) 掌握泛型接口的定义与实现: (5)了解泛型程序设计,理解其用途. 2.实验 ...

  8. dij+DP

    众所周知,蒜蒜是一名热爱工作的好员工,他觉得时间就是金钱,做事情总是争分夺秒. 这天晚上,蒜蒜一个人去吃晚饭.不巧的是,吃完饭以后就开始下雨了,蒜蒜并没有带雨伞出来.但是蒜蒜热爱工作,工作使他快乐,他 ...

  9. Gym101630C Connections

    题目大意: 给出一个\(n\)个点\(m\)条边的有向图,无自环无重边.要求把这个图进行删边,直到只剩下\(2n\)条边,使得图中每个点都可以相互连通. 知识点: DFS 解题思路: 从点\(1\)出 ...

  10. 实验五:shell脚本编程

    项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接地址 学号-姓名 17043133-木腾飞 作业学习目标 1.了解shell 脚本的概念及应用2.掌握shell ...