LeetCode Solutions (161 серия деталей)
Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Проблема LeetCode #916 (среда): Слово подмножества
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Нам дают два массива A
и B
слов. Каждое слово представляет собой строку строчных букв.
Теперь скажите это слово b
это подмножество слов A
Если каждая буква в b
происходит в A
, в том числе множественность Анкет Например, "WRR"
это подмножество "Воин"
, но это не подмножество "Мир"
Анкет
Теперь скажите слово A
от A
это универсальный Если для каждого b
в B
, b
это подмножество A
Анкет
Вернуть список всех универсальных слов в A
. Вы можете вернуть слова в любом порядке.
Примеры:
Вход: | A = [“Amazon”, “Apple”, “facebook”, “Google”, “LeetCode”] b = [“e”, “o”] |
Выход: | [“Facebook”, “Google”, “LeetCode”] |
Вход: | A = [“Amazon”, “Apple”, “facebook”, “Google”, “LeetCode”] b = [“l”, “e”] |
Выход: | [“Apple”, “Google”, “LeetCode”] |
Вход: | A = [“Amazon”, “Apple”, “facebook”, “Google”, “LeetCode”] b = [ “e”, “oo”] |
Выход: | [“facebook”, “Google”] |
Вход: | A = [“Amazon”, “Apple”, “facebook”, “Google”, “LeetCode”] b = [“lo”, “eo”] |
Выход: | [“Google”, “LeetCode”] |
Вход: | A = [“Amazon”, “Apple”, “facebook”, “Google”, “LeetCode”] b = [“ec”, “OC”, “Ceo”] |
Выход: | [“Facebook”, “LeetCode”] |
Ограничения:
1. длиной, B.length
1 [i] .length, b [i] .length
[Я]
иБ [я]
состоит только из строчных букв.- Все слова в
A [i]
уникальны: нетя
с[I] [j]
.
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
Первый крупный ярлык, который мы можем распознать, заключается в том, что если слово в A должен соответствовать все записи в Беременный , тогда нам не нужно думать обо всех записях B как отдельный. Наш первый шаг должен быть, чтобы объединить все слова в B в одно главное слово, для которого все слова в B подмножества этого. В Пример 5 , например, когда B = [“ec”, “oc”, “генеральный директор”] , главное слово было бы «Генеральный директор» Анкет
Чтобы сделать это, нам нужно использовать какой -то своего рода частотная карта Анкет Поскольку мы имеем дело с персонажами, мы можем использовать Arraymap длины 26 что должно быть быстрее, чем использование обычной структуры карты. Нам нужно иметь два таких ArrayMaps: один будет хранить накопленные данные ( bfreq ), а другой ( ceck ) будет использоваться для временного хранения каждого слова в B Прежде чем проверить это против Bfreq Анкет
Вместо того, чтобы создавать новый массив для каждого слова, нам просто нужно убедиться, что сбросить Проверьте всем 0 до следующего слова.
Пока мы проверяем слова в B , мы также должны отслеживать, сколько персонажей в настоящее время хранятся в Bfreq ( cmax ). Если Cmax идет выше 10 , тогда это не будет возможно для любого слова в A соответствовать этому из -за ограничений на A.Length , поэтому мы должны возврат пустой массив.
Как только у нас будет хранится наша главная информация о словах Bfreq , мы можем повторить слова в A и сравните их с Bfreq аналогичным образом. Во -первых, однако, мы можем легко пропустить любое слово, которое не так долго, как Cmax Анкет Если мы переживаем все слово, не запуская раннее перерыв , мы можем добавить слово в наш массив ответов ( ans ).
Как только мы все закончили итерацию через A , мы можем вернуть ANS Анкет
Реализация:
Питон здесь, как правило, намного медленнее с Arraymap , но может использовать нормальный диктат и count () Чтобы немного ускорить ситуацию.
Есть также пример Python с использованием counter () и его простых сравнений для некоторого короткого кода, хотя и более медленное время.
Java должна преобразовать Строки к char [] Перед итерацией через.
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
var wordSubsets = function(A, B) { let Bfreq = new Int8Array(26), cmax = 0, check = new Int8Array(26), ans = [] for (let i = 0; i < B.length; i++, check.fill()) { let word = B[i] for (let j = 0; j < word.length; j++) check[word.charCodeAt(j) - 97]++ for (let j = 0; j < 26; j++) { let diff = check[j] - Bfreq[j] if (diff > 0) cmax += diff, Bfreq[j] += diff if (cmax > 10) return [] } } for (let i = 0; i < A.length; i++, check.fill()) { let word = A[i], j if (word.length < cmax) continue for (j = 0; j < word.length; j++) check[word.charCodeAt(j) - 97]++ for (j = 0; j < 26; j++) if (check[j] < Bfreq[j]) break if (j === 26) ans.push(word) } return ans };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def wordSubsets(self, A: List[str], B: List[str]) -> List[str]: Bfreq, ans, cmax = {}, [], 0 for word in B: for char in word: count = word.count(char) if char in Bfreq: diff = count - Bfreq[char] if diff > 0: Bfreq[char] = count cmax += diff else: Bfreq[char] = count cmax += count if cmax > 10: return ans print(Bfreq) for word in A: if len(word) < cmax: continue for char in Bfreq: if word.count(char) < Bfreq[char]: break else: ans.append(word) return ans
Код Python с счетчиком:
( Прыгните к : Описание задачи Идея решения
class Solution: def wordSubsets(self, A: List[str], B: List[str]) -> List[str]: Bfreq = Counter() for word in B: Bfreq |= Counter(word) if sum(Bfreq.values()) > 10: return [] return [word for word in A if not Bfreq - Counter(word)]
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { public ListwordSubsets(String[] A, String[] B) { int[] Bfreq = new int[26], check = new int[26]; int cmax = 0; List ans = new ArrayList<>(); for (int i = 0; i < B.length; i++, Arrays.fill(check, 0)) { for (char c : B[i].toCharArray()) check[c - 'a']++; for (int j = 0; j < 26; j++) { int diff = check[j] - Bfreq[j]; if (diff > 0) { cmax += diff; Bfreq[j] += diff; } } if (cmax > 10) return ans; } for (int i = 0; i < A.length; i++, Arrays.fill(check, 0)) { int j; for (char c : A[i].toCharArray()) check[c - 'a']++; for (j = 0; j < 26; j++) if (check[j] < Bfreq[j]) break; if (j == 26) ans.add(A[i]); } return ans; } }
C ++ Код:
( Прыгните к : Описание задачи Идея решения
class Solution { public: vectorwordSubsets(vector & A, vector & B) { int Bfreq[26] = {0}, check[26] = {0}; int cmax = 0; vector ans; for (string word : B) { for (char c : word) check[c - 'a']++; for (int j = 0; j < 26; j++) { int diff = check[j] - Bfreq[j]; if (diff > 0) cmax += diff, Bfreq[j] += diff; } if (cmax > 10) return ans; fill(check, check+26, 0); } for (string word : A) { int j; for (char c : word) check[c - 'a']++; for (j = 0; j < 26; j++) if (check[j] < Bfreq[j]) break; if (j == 26) ans.push_back(word); fill(check, check+26, 0); } return ans; } };
LeetCode Solutions (161 серия деталей)
Оригинал: “https://dev.to/seanpgallivan/solution-word-subsets-1fnj”