给定一个仅包含数字 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. 简述SpringCloud底层原理

    目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核心组件:Feign 四.Spring Cloud核心组件:Ribbon 五.Spring Cl ...

  2. 2020年腾讯实习生C++面试题&持续更新中(1)

    2020年腾讯实习生C++面试题&持续更新中(1) 腾讯面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的 ...

  3. 如何搭建一个WEB服务器项目(五)—— Controller返回JSON字符串

    从服务器获取所需数据(JSON格式) 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验 ...

  4. nginx default server

    配合server_name _ 可以匹配所有的域名,在设置default server 可以轻松屏蔽一些非域名访问的请求. 配置如下 server { listen 80 default_server ...

  5. 使用Redis——拳打南山敬老院,脚踩北斗幼儿园

    拳打南山敬老院,脚踩北斗幼儿园 Redis 你说你用过对吧,你们怎么用的? 面试官您好,因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都 ...

  6. hdu6470 Count 矩阵快速幂

    hdu6470 Count #include <bits/stdc++.h> using namespace std; typedef long long ll; , mod = ; st ...

  7. 4.2 Go switch

    4.2 Go switch switch语句用于基于不同条件执行不同动作,每一个case分支唯一,自上而下逐一测试,直到匹配结束,默认自动终止,不需要break. 2. switch基本语法 swit ...

  8. [Asp.Net Core] Blazor WebAssembly - 工程向 - 如何在欢迎页面里, 预先加载wasm所需的文件

    前言, Blazor Assembly 需要最少 1.9M 的下载量.  ( Blazor WebAssembly 船新项目下载量测试 , 仅供参考. ) 随着程序越来越复杂, 引用的东西越来越多,  ...

  9. 浅析String、StringBuilder、StringBuffer

    谈谈我对 String.StringBuilder.StringBuffer 的理解 StringBuilder.StringBuffer 和 String 一样,都是用于存储字符串的. 1.那既然有 ...

  10. 蓝桥杯 试题 算法提高 宰羊 DP解决

    问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃. 炫炫家有N只羊,羊圈排成一排,标号1~N.炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居 ...