使用 Java ArrayList 打印电话号码可能出现的所有单词

java programming object oriented programmingprogramming更新于 2025/1/9 4:28:17

给你一个手机键盘,以及需要按下的按键,你的任务是打印按下这些数字可能出现的所有单词。

输入输出场景

让我们通过一个例子来进一步理解:

输入

str = "32"

输出

[gd, hd, id, ge, je, ie, gf, hf, if]

按 3 次可以组成的字符是 g、h、i,按 2 次可以组成的字符是 d、e、f。因此,所有单词都将是第一个字符属于 g、h、i,第二个字符属于 d、e、f 的组合。

要根据电话号码打印所有可能的单词,您可以使用递归方法生成与电话号码对应的所有可能的字母组合。

步骤/方法

在此示例中,我们定义了一个 phoneMap,将每个数字映射到对应字母的列表。我们还定义了一个 getWordsFromDigits 函数,该函数接受当前数字、正在构造的当前单词以及所有可能单词的列表。

getWordsFromDigits 函数首先检查是否没有更多数字需要处理。如果是,它将当前单词添加到所有可能单词的列表中并返回。否则,它会检索与第一位数字对应的字母,并为每个字母递归调用 getWordsFromDigits,传入剩余的数字和更新后的当前单词。

在主函数中,我们初始化电话号码和一个空的单词列表,并使用这些参数调用 getWordsFromDigits。最后,我们循环遍历所有可能的单词列表,并逐一打印出来。

示例

Here is a sample code:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PhoneDigitsConvertToWords {   
   //用于存储电话数字和字符的哈希表
    private static Map<Character, List<Character>> phoneDigitMap = new HashMap<>();
   
    static {
        phoneDigitMap.put('2', Arrays.asList('a', 'b', 'c'));
        phoneDigitMap.put('3', Arrays.asList('d', 'e', 'f'));
        phoneDigitMap.put('4', Arrays.asList('g', 'h', 'i'));
        phoneDigitMap.put('5', Arrays.asList('j', 'k', 'l'));
        phoneDigitMap.put('6', Arrays.asList('m', 'n', 'o'));
        phoneDigitMap.put('7', Arrays.asList('p', 'q', 'r', 's'));
        phoneDigitMap.put('8', Arrays.asList('t', 'u', 'v'));
        phoneDigitMap.put('9', Arrays.asList('w', 'x', 'y', 'z'));
    }
   
   //Driver method
    public static void main(String[] args) {
        String digitsStr = "23";
        List<String> words = new ArrayList<>();
        getWordsFromPhoneDigits(digitsStr, "", words);
        for (String word : words) {
            System.out.println(word);
        }
    }
   
   //从输入的电话号码字符串中获取单词的方法
    private static void getWordsFromPhoneDigits(String digitsStr, String currentWord, List<String> words) {
        if (digitsStr.length() == 0) {
            words.add(currentWord);
            return;
        }
        char digit = digitsStr.charAt(0);
        List<Character> letters = phoneDigitMap.get(digit);
        for (Character letter : letters) {
            getWordsFromPhoneDigits(digitsStr.substring(1), currentWord + letter, words);
        }
    }
}

输出

ad
ae
af
bd
be
bf
cd
ce
cf

时间和空间复杂度

该解决方案的时间复杂度为 O(3^N * 4^M),其中 N 表示对应 3 个字母(2、3、4、5、6、8)的数字数量,M 表示对应 4 个字母(7、9)的数字数量。这是因为对应三个字母的每个数字都有三个可能的字母,而对应四个字母的每个数字都有四个可能的字母。因此,共有 3^N * 4^M 种可能的字母组合。

由于这是可能生成的单词数量上限,因此该解决方案的空间复杂度也为 O(3^N * 4^M)。在最坏的情况下,每个字母组合都会生成一个有效的单词,因此我们必须将每个单词存储在单词列表中。


相关文章