解决LEET代码上的“电话号码的字母组合”问题
#编程 #编码 #career #java

17.电话号码的字母组合

问题类型:媒介
喜欢17.1k
被896

不喜欢

问这个问题的公司
公司:Noof Times

亚马逊5
苹果4
微软6
Google 5
Facebook 4
Uber 4
彭博3
肖3
Adobe 2
eBay 2
Intuit 2
雅虎2
Twilio 2
Oracle 8
Twitter 5
高盛5
Epic Systems 4
Swiggy 4
VMware 3
Nutanix 3
Duolingo 3
Snapchat 2
LinkedIn 2
三星2
摩根士丹利2
思科2
沃尔玛实验室2
Twitch 2
特斯拉2
ServiceNow 2
Capital One 2
Dropbox 1

给定一个包含2-9个包含数字的字符串,返回数字可以代表的所有可能的字母组合。以任何顺序返回答案。

在下面给出了将数字映射到字母上(就像在电话按钮上一样)。请注意,1不映射到任何字母。

Image 1

示例1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例2:
输入:digits = ""
输出:[]

示例3:
输入:digits = "2"
输出:["a","b","c"]

方法:

怎么运行的:

映射:想象一下手机上的每个数字(2至9)都有一些字母,就像计算机键盘上的字母一样。该代码将这些关联存储在名为键盘的列表中。

主要工作:主要工作是通过信函函数完成的。您给它一个数字序列,它为您提供了一个可以制作的所有可能单词的列表。

起点:如果您不给它任何数字(一个空序列),它说:“我不能用任何话来说明”,它为您提供了一个空列表。

魔术助手:字母复合功能的功能,有一个特殊的助手,称为LetterCombinationsRecursive。这个助手完成了大部分工作。

递归想法:魔术在这里发生。助手们一一看着每个数字。对于每个数字,它找到了与键盘的数字相关的字母。

混合和匹配:然后,它开始混合并匹配这些字母以做单词。它通过一次添加一个字母并跟踪它可以创建的单词来尝试所有可能的组合。

继续前进:它对序列中的所有数字进行此操作。每次,它都会向其写的单词添加更多字母。

保存魔术词:每当它完成一个组合时(当它使用了所有数字时),就会将该单词保存在特殊列表中。

返回魔术词:经历了所有可能性后,它会使您回到它发现的魔术词列表。

代码:

import java.util.ArrayList;
import java.util.List;

class Solution {
    static String[] keypad = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };

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

        letterCombinationsRecursive(digits, 0, "", stringList);

        return stringList;
    }

    private void letterCombinationsRecursive(String digits, int index, String ans, List<String> stringList) {
        if (index == digits.length()) {
            stringList.add(ans);
            return;
        }

        String key = keypad[digits.charAt(index) - '0'];

        for (int i = 0; i < key.length(); i++) {
            letterCombinationsRecursive(digits, index + 1, ans + key.charAt(i), stringList);
        }
    }   
}

愉快的编码,
湿婆