Программа на Java для телефонной мнемоники

Опубликовано: 16 Января, 2022

В повседневной жизни мы должны помнить множество телефонных номеров. Большинству людей довольно сложно запомнить такие огромные 10-значные телефонные номера. Простое решение - связать этот номер телефона с каким-нибудь известным словом.
Например, мы можем связать телефонный номер 32627287 с DAMASCUS на основе символов на нашей панели набора номера. (Мы можем заменить ЦИФРУ на любой из соответствующих СИМВОЛОВ, которые она представляет на панели набора номера. Например, у нас есть ABC, упомянутая в пункте 2 на панели набора номера. Таким образом, мы можем представить 2 с помощью A или B или C. Аналогичным образом мы можем замените 3 на D, E или F.

Напишите программу, которая примет телефонный номер и распечатает все возможные такие слова, которые есть в нашем словаре.

Рассмотрим пример ввода 23.
Здесь,
2 можно заменить на A, B или C.
3 можно заменить на D, E или F.
Таким образом, одной допустимой комбинацией будет AD, что соответствует 623 году.
Другой может быть CD и так далее.
Мы генерируем все возможные перестановки, начиная с {A или B или C}, а затем с {D или E или F}. Однако будут напечатаны только те перестановки, которые есть в нашем словаре. Эти выбранные слова будут представлять наш образец вывода.

Однако ЦИФРЫ, такие как 1 и 0, будут заменены пустой строкой, поскольку они не представляют никаких символов на панели набора номера, т.е. 1 и 0 будут представлять «».

Примеры:

Ввод: 23
Вывод: [BE]

Ввод: 623
Вывод: [MAD, OCD]

Ввод: 726
Вывод: [PAN, PCM, PCO, RAM, SAM]

Ввод: 2
Вывод: [A, B, C]

Ввод: 123
Вывод: [BE]

.
Naive Approach
This program uses backtracking to generate all possible words .Click here to know more. The concept of backtracking has been explained there.

import java.util.*;
  
public class PhoneMnemonics {
    static ArrayList<String> dictionary = new ArrayList<String>();
  
    /* List all the phone mnemonics for the given digit sequence.
     * @param input a digit sequence, like "23432" */
    public static ArrayList<String> listMnemonics(String input)
    {
        ArrayList<String> list = new ArrayList<String>();
        String[] dic = { "A", "B", "C", "D", "E", "F", "G"
                        "H", "I", "J", "K", "L", "M", "N",
                        "O", "P", "Q", "R", "S", "T", "U"
                         "V", "W", "X", "Y", "Z", "MAD",
                         "OCD", "PAN", "PCM", "PCO", "RAM", "SAM", "BE" };
        for (String i : dic)
            dictionary.add(i);
        listMnemonics("", input, list);
        return list;
    }
  
    /* Helper recursive method to list phone mnemonics. This works by finding
     * all possibilities for the first digit, then recursing on the rest of the
     * string. For example, if prefix is "AB" and remaining is "2", then the
     * mnemonics "ABA", "ABB", and "ABC" would be printed.
     
     * @param prefix : the part of the mnemonic that has already been built
     * @param remaining :  the remaining digits to include in the mnemonic  */
    private static void listMnemonics(String prefix, String remaining, 
                                                ArrayList<String> list)
    {
        // Base case: when there are no more characters to process,
        // just print out the mnemonic that we"ve already built.
        if (remaining.isEmpty()) {
            if (!list.contains(prefix) && dictionary.contains(prefix))
                list.add(prefix);
            return;
        }
  
        // Recursive case.
        if (remaining.charAt(0) == "1" || remaining.charAt(0) == "0") {
            listMnemonics(prefix, remaining.substring(1), list);
        }
  
        String digits = digitLetters(remaining.charAt(0));
        for (int i = 0; i < digits.length(); i++) {
            String newPrefix = prefix + digits.charAt(i);
            String newRemaining = remaining.substring(1);
            listMnemonics(newPrefix, newRemaining, list);
        }
    }
  
    /**
     * Get the letters appearing on a given key of a standard phone keypad.
     * @param ch the character representation of a digit on the phone keypad
     *            (like "2")
     * @return a string containing the letters on the given key, or the empty
     *         string if the key is not recognized
     */
    private static String digitLetters(char ch)
    {
        switch (ch) {
        case "2":
            return "ABC";
        case "3":
            return "DEF";
        case "4":
            return "GHI";
        case "5":
            return "JKL";
        case "6":
            return "MNO";
        case "7":
            return "PQRS";
        case "8":
            return "TUV";
        case "9":
            return "WXYZ";
        }
        return "";
    }
  
    public static void main(String[] args)
    {
        String str = "123";
        ArrayList<String> list = listMnemonics(str);
        System.out.println(list);
    }
}
Output:
[BE]

Примечание: эта программа станет более удобной для пользователей после того, как мы добавим словарь слов вместе с частотой их использования. Используя словарь, следующий вывод можно было бы оптимизировать для печати MAD, OCD и т. Д. На основе их частоты использования использование пользователями. Перейдите по этой ссылке: https://phonespell.org/.

Связанная статья с реализацией C ++:
вывести все возможные слова из цифр телефона


Ссылка :

Рекурсивное мышление Эрика Робертса .

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.