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

Решение: Слово подмножества

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

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 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”