classSolution { public: intmaxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score){ int n = words.size(), res = 0; vector<int> count(26); for (auto c : letters) { count[c - 'a']++; } for (int s = 1; s < (1 << n); s++) { vector<int> wordCount(26); // 统计子集 s 所有单词的字母数目 for (int k = 0; k < n; k++) { if ((s & (1 << k)) == 0) { // words[k] 不在子集 s 中 continue; } for (auto c : words[k]) { wordCount[c - 'a']++; } } bool ok = true; // 判断子集 s 是否合法 int sum = 0; // 保存子集 s 的得分 for (int i = 0; i < 26; i++) { sum += score[i] * wordCount[i]; ok = ok && (wordCount[i] <= count[i]); } if (ok) { res = max(res, sum); } } return res; } };
publicclassSolution { publicintMaxScoreWords(string[] words, char[] letters, int[] score) { int n = words.Length, res = 0; int[] count = newint[26]; foreach (char c in letters) { count[c - 'a']++; } for (int s = 1; s < (1 << n); s++) { int[] wordCount = newint[26]; // 统计子集 s 所有单词的字母数目 for (int k = 0; k < n; k++) { if ((s & (1 << k)) == 0) { // words[k] 不在子集 s 中 continue; } foreach (char c in words[k]) { wordCount[c - 'a']++; } } bool ok = true; // 判断子集 s 是否合法 int sum = 0; // 保存子集 s 的得分 for (int i = 0; i < 26; i++) { sum += score[i] * wordCount[i]; ok = ok && (wordCount[i] <= count[i]); } if (ok) { res = Math.Max(res, sum); } } return res; } }
var maxScoreWords = function(words, letters, score) { let n = words.length, res = 0; const count = newArray(26).fill(0); for (const c of letters) { count[c.charCodeAt() - 'a'.charCodeAt()]++; } for (let s = 1; s < (1 << n); s++) { const wordCount = newArray(26).fill(0); // 统计子集 s 所有单词的字母数目 for (let k = 0; k < n; k++) { if ((s & (1 << k)) === 0) { // words[k] 不在子集 s 中 continue; } for (let i = 0; i < words[k].length; i++) { const c = words[k][i]; wordCount[c.charCodeAt() - 'a'.charCodeAt()]++; } } let ok = true; // 判断子集 s 是否合法 let sum = 0; // 保存子集 s 的得分 for (let i = 0; i < 26; i++) { sum += score[i] * wordCount[i]; ok = ok && (wordCount[i] <= count[i]); } if (ok) { res = Math.max(res, sum); } } return res; };
复杂度分析
时间复杂度:O \big (L + (S + \sum) \times 2^n \big ),其中 L 是数组 letters 的长度,S 是字符串数组 words 的所有字符串长度,\sum=26 是字符集大小。words 中的每个单词存在于 2^{n-1 个子集中,因此每个单词被遍历 2^{n-1 次。