Рубрики
Без рубрики

Решение: гласная проверка орфографии

Это является частью серии объяснений решений LeetCode (индекс). Если вам понравилось это решение или fou … с меткой алгоритмы, JavaScript, Java, Python.

LeetCode Solutions (161 серия деталей)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет

Проблема LeetCode #966 (среда): Главная Переписка

Описание:

( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++

Дал СЛОВО СЛОВО , мы хотим реализовать заклинатель орфографии, который преобразует слово запроса в правильное слово.

Для данного запрос Слово, проверка орфографии обрабатывает две категории орфографических ошибок:

  • Заглавная способность: если запрос соответствует слову в списке слов ( нечувствительный к случаю ), то слово запроса возвращается с тем же случаем, что и в случае в списке.

    • Пример: WordList = ["Желтый"] , запрос : правильный
    • Пример: WordList = ["Желтый"] , запрос : правильный
    • Пример: WordList = ["Желтый"] , запрос : правильный
  • Ошибки гласных: если после замены гласных ('a', 'e', 'i', 'o', 'u') Слова запроса с любым гласным индивидуально , он соответствует слову в списке Word ( нечувствительный к случаю ), тогда слово запроса возвращается с тем же случаем, что и сопоставление в списке Words.

    • Пример: WordList = ["Желтый"] , запрос : правильный
    • Пример: WordList = ["Желтый"] , запрос : Правильно (не совпадает)
    • Пример: WordList = ["Желтый"] , запрос : Правильно (не совпадает)

Кроме того, проверка орфографии работает в соответствии с следующими правилами приоритета:

  • Когда запрос точно соответствует слову в списке слов ( чувствительный к случаям ), вы должны вернуть одно и то же слово обратно.
  • Когда запрос соответствует слову вплоть до капитлизации, вы должны вернуть первое такое совпадение в списке Words.
  • Когда запрос соответствует слову до ошибок гласных, вы должны вернуть первое такое совпадение в списке Words.
  • Если в запросе нет совпадений в списке слов, вы должны вернуть пустую строку.

Дал несколько Запросы , вернуть список слов отвечать , где Ответ [i] правильное слово для запрос [i] Анкет

Примеры:

Вход: WordList = [“Кайт”, “воздушный змей”, “Зат”, “Зат”], запросы = [“Кайт”, “воздушный змей”, “воздушный змей”, «Зат», «Зат», «Слух», «Слушай», «Кети», «Кет», «Кето»]
Выход: [“воздушный змей”, “воздушный змей”, “воздушный змей”, “Зат”, “Зат”, “,” “,” Кайт “,” “,” Кайт “]

Ограничения:

  • 1. длиной
  • 1. длиной
  • 1 [i].
  • 1 [i].
  • Все строки в СЛОВО СЛОВО и Запросы состоят только из английских букв.

Идея:

( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++

Эта проблема может быть разбита на пару этапов растущей сложности. Первый шаг – проверить, существуют ли слова в списке запросов ( q ) в списке слов ( w ). Для этого мы можем использовать самую простую форму структуры данных, похожих на стоимость, которая является Установить Анкет

Далее нам нужно проверить, имеет ли каждый запрос нечувствительный матч в W Анкет Для нечувствительного соответствия, самая простой, что нужно сделать, это нижний регистр (или uppercare ) оба термина перед сравнением. В этом случае, поскольку мы хотим сопоставить один термин, но вернуть другой, мы должны использовать Карта Структура данных, где ключ является более низким термином и значение это совпадение слово .

Но здесь мы сталкиваемся с проблемой, так как можно иметь два слова иметь одинаковую форму нижней части. Согласно правилам, мы хотим отдать предпочтение тому, что появляется первым в W , Итак, мы можем либо перевернуть через W Первоначально и неоднократно проверяйте, чтобы убедиться, что мы не перезаписываем существующую запись, или мы можем просто перевернуть через W обратно и просто автоматически перезаписать записи. Это заставит первое явление быть тем, кто «придерживается».

Для третьей проверки нам нужно соответствовать Слово За исключением гласных. Всякий раз, когда вам нужно выборочно сопоставить строки только на часть, самый простой способ сделать это – с Маска Анкет В этом случае мы можем использовать regex Чтобы заменить все случаи гласных на Маска персонажа , например, “#” Анкет Например, мы можем проверить, есть ли “Хвост” и “Инструмент” соответствовал бы, применяя маски персонажа к обоим терминам и увидев, что “T ## L” Анкет

Это требует другой структуры карты. Мы могли бы технически повторно использовать более ранний, так как не будет совпадений, но навигация о двух отдельных, меньших картах, как правило, более эффективно, чем одна большая. Поскольку мы также захотим итерации назад через W Для этой карты мы также делаем это одновременно с другой.

Тогда мы можем просто повторить через Q и проверьте на наличие совпадений в правильном порядке. Как правило, в списках запросов, мы можем заменить запросы в Q С их результатом, чтобы сохранить Сложность пространства Анкет

затем , когда мы закончим, мы просто возврат Q Анкет

Реализация:

JavaScript может использовать логично или Цепочка, чтобы сократить назначение правильного результата в Q Анкет

В Java и C ++ Regex намного медленнее, поэтому мы можем использовать вспомогательную функцию, чтобы сделать то же самое для нас.

C ++ также понадобится помощник, чтобы закрепить слова.

Код JavaScript:

( Прыгните к : Описание задачи Идея решения

const regex = /[aeiou]/g
var spellchecker = function(W, Q) {
    let orig = new Set(W), lower = new Map(), mask = new Map()
    for (let i = W.length - 1; ~i; i--) {
        let word = W[i], wlow = word.toLowerCase()
        lower.set(wlow, word)
        mask.set(wlow.replace(regex, "*"), word)
    }
    for (let i in Q) {
        let query = Q[i], qlow = query.toLowerCase(),
            qmask = qlow.replace(regex, "*")
        if (orig.has(query)) continue
        else Q[i] = lower.get(qlow) || mask.get(qmask) || ""
    }
    return Q
};

Код Python:

( Прыгните к : Описание задачи Идея решения

class Solution:
    def spellchecker(self, W: List[str], Q: List[str]) -> List[str]:
        orig, lcase, mask = set(W), defaultdict(), defaultdict()
        regex = r'[aeiou]'
        for i in range(len(W)-1,-1,-1):
            word = W[i]
            wlow = word.lower()
            lcase[wlow] = word
            mask[re.sub(regex, '*', wlow)] = word
        for i in range(len(Q)):
            query = Q[i]
            qlow = query.lower()
            qmask = re.sub(regex, '*', qlow)
            if query in orig: continue
            elif qlow in lcase: Q[i] = lcase[qlow]
            elif qmask in mask: Q[i] = mask[qmask]
            else: Q[i] = ""
        return Q

Код Java:

( Прыгните к : Описание задачи Идея решения

class Solution {
    public String[] spellchecker(String[] W, String[] Q) {
        Set orig = new HashSet<>(Arrays.asList(W));
        Map lower = new HashMap<>(), mask = new HashMap<>();
        for (int i = W.length - 1; i >= 0; i--) {
            String word = W[i], wlow = word.toLowerCase();
            lower.put(wlow, word);
            mask.put(vmask(wlow), word);
        }
        for (int i = 0; i < Q.length; i++) {
            String query = Q[i], qlow = query.toLowerCase(),
                qmask = vmask(qlow);
            if (orig.contains(query)) continue;
            else if (lower.containsKey(qlow)) Q[i] = lower.get(qlow);
            else if (mask.containsKey(qmask)) Q[i] = mask.get(qmask);
            else Q[i] = "";
        }
        return Q;
    }
    public String vmask(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') c = '*';
            sb.append(c);
        }
        return sb.toString();
    }
}

C ++ Код:

( Прыгните к : Описание задачи Идея решения

class Solution {
public:
    vector spellchecker(vector& W, vector& Q) {
        set orig (W.begin(), W.end());
        unordered_map lower, mask;
        for (int i = W.size() - 1; ~i; i--) {
            string word = W[i], wlow = lcase(word);
            lower[wlow] = word, mask[vmask(wlow)] = word;
        }
        for (string &query : Q) {
            string qlow = lcase(query), qmask = vmask(qlow);
            if (orig.count(query)) continue;
            else if (lower.count(qlow)) query = lower[qlow];
            else if (mask.count(qmask)) query = mask[qmask];
            else query = "";
        }
        return Q;
    }
    static string vmask(string str) {
        for (char &c : str)
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
                c = '*';
        return str;
    }
    static string lcase(string str) {
        for (char &c : str) c = tolower(c);
        return str;
    }
};

LeetCode Solutions (161 серия деталей)

Оригинал: “https://dev.to/seanpgallivan/solution-vowel-spellchecker-22o”