Back to all solutions

#916 - Word Subsets

Problem Description

You are given two string arrays words1 and words2.

A string b is a subset of string a if every letter in b occurs in a including multiplicity.

For example, "wrr" is a subset of "warrior" but is not a subset of "world".

A string a from words1 is universal if for every string b in words2, b is a subset of a.

Return an array of all the universal strings in words1. You may return the answer in any order.

Solution

/**
 * @param {string[]} words1
 * @param {string[]} words2
 * @return {string[]}
 */
var wordSubsets = function(words1, words2) {
  const count = (string, char) => string.split(char).length - 1;
  const subset = Array.from(words2.reduce((map, b) => {
    b.split('').forEach(char => {
      map.set(char, (map.get(char) || 0) > count(b, char) ? map.get(char) : count(b, char));
    });
    return map;
  }, new Map()));
  return words1.filter(a => subset.every(match => count(a, match[0]) >= match[1]));
};