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

Решение: найдите и заменить шаблон

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

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

Проблема летета # 890 (средний): найдите и заменить шаблон

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Учитывая список строк слова и строка узор , вернуть Список слова [я] этот матч шаблон . Вы можете вернуть ответ в любой заказ Отказ

Слово соответствует шаблону, если существует перестановка букв p Так что после замены каждую букву х в шаблоне с P (x) мы получаем желаемое слово.

Напомним, что перестановка букв – это биксирование от писем к буквам: каждая буква карты на другую букву, а не две буквы карты к тому же букву.

Примеры:

Вход: слова = [«ABC», «DEQ», «Mee», «AQQ», «DKD», «CCC»],
Вывод: [«Mee», «AQQ»]
Объяснение: «Mee» сочетается с узором, потому что есть перестановка {A -> M, B -> E, …}. ” CCC «не соответствует шаблону, потому что {A -> C, B -> C, …} не является перестановкой, поскольку A и B отображается на одну и ту же букву.
Вход: слова = [«А», «B», «C»],
Вывод: [«А», «B», «C»]

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

  • 1 длиной
  • 1 длиной
  • слова [I] .length.length
  • узор и слова [я] являются строчными английскими буквами.

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

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

В этот момент, то цель состоит в том, чтобы сделать сравнение максимально проще. Для этого мы можем реять слова в качестве алфавитной последовательности, где первый новый персонаж, который мы сталкиваемся, это всегда замаскированный к «А» , второй до “B” , и так далее. Если мы применяем этот же процесс для узор Во-первых, тогда должно быть намного проще сравнить слова для узор Отказ

Во-первых, мы можем определить функцию помощника к Перевести персонажи для нас. Мы должны создать карта или Массив Структура ( Codex ) Чтобы отслеживать отображение персонажа для данного слова. Перевести Функция затем проверяет, будет ли символ уже сопоставлен, и если это так, вернуть его сопоставленное значение. Если нет, это присваивает это следующее неиспользуемое алфавитное значение.

Затем мы можем легко легко Перевести узор в шифр маска, которую мы можем тогда Сравнить каждому слово в слова используя другой помощник функции. Сравнить Функция очистит Кодекс для каждого слово Затем мы можем сравнить каждый символ слово к соответствующему символу в шифр Отказ Если в любое время мы не подходим, мы можем быстро вернуть из сравнения и продолжить с следующим слово Отказ Если переведен слово полностью соответствует шифр , его можно добавить к нашему массиву ответа ( ANS ).

Тогда мы можем Вернуть АНС Как только мы закончим.

  • Сложность времени: O (n * m) где N это длина слов и M длина каждого слово / шаблон
  • Космическая сложность: O (M) для кодекс
    • или O (n + m) Если вы подсчитаете пространство вывода ( анс )

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var findAndReplacePattern = function(words, pattern) {
    let ans = [], codex = new Map()
    const translate = char => {
        if (!codex.has(char))
            codex.set(char, String.fromCharCode(97 + codex.size))
        return codex.get(char)
    }
    const compare = word => {
        codex.clear()
        for (let i = 0; i < word.length; i++)
            if (translate(word[i]) !== cipher[i])
                return
        ans.push(word)
    }
    let cipher = new Array(pattern.length)
    for (let i = 0; i < pattern.length; i++)
        cipher[i] = translate(pattern.charAt(i))
    words.forEach(compare)
    return ans
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def findAndReplacePattern(self, words: List[str], pattern: str) -> List[str]:
        ans, codex = [], defaultdict()
        def translate(c: str) -> str:
            if c not in codex:
                codex[c] = chr(97 + len(codex))
            return codex[c]
        def compare(word: str) -> None:
            codex.clear()
            for i in range(len(word)):
                if translate(word[i]) != cipher[i]:
                    return
            ans.append(word)
        cipher = [translate(c) for c in pattern]
        for word in words:
            compare(word)
        return ans

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    List ans;
    Map codex;
    char[] cipher;

    public List findAndReplacePattern(String[] words, String pattern) {
        ans = new ArrayList<>();
        codex = new HashMap<>();
        cipher = pattern.toCharArray();
        for (int i = 0; i < pattern.length(); i++)
            cipher[i] = translate(cipher[i]);
        for (String word : words) compare(word);
        return ans;
    }
    private char translate(char c) {
        if (!codex.containsKey(c))
            codex.put(c, (char)(97 + codex.size()));
        return codex.get(c);
    }
    private void compare(String word) {
        codex.clear();
        for (int i = 0; i < word.length(); i++)
            if (translate(word.charAt(i)) != cipher[i]) return;
        ans.add(word);
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    vector findAndReplacePattern(vector& words, string pattern) {
        ans.resize(0);
        codex.clear();
        cipher = pattern;
        for (int i = 0; i < pattern.size(); i++)
            cipher[i] = translate(cipher[i]);
        for (auto& word : words) compare(word);
        return ans;
    }
private:
    vector ans;
    unordered_map codex;
    string cipher;
    char translate(char& c) {
        if (codex.find(c) == codex.end())
            codex[c] = (char)(97 + codex.size());
        return codex[c];
    }
    void compare(string& word) {
        codex.clear();
        for (int i = 0; i < word.length(); i++)
            if (translate(word[i]) != cipher[i]) return;
        ans.push_back(word);
    }
};

Оригинал: “https://dev.to/seanpgallivan/solution-find-and-replace-pattern-2hm”