Это является частью серии объяснений решения 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 { Listans; 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: vectorfindAndReplacePattern(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”