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.length1 [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 List wordSubsets(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:
vector wordSubsets(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”