題目以下:app
Given a list of
words
, list of singleletters
(might be repeating) andscore
of every character.spaReturn the maximum score of any valid set of words formed by using the given letters (
words[i]
cannot be used two or more times).codeIt is not necessary to use all characters in
letters
and each letter can only be used once. Score of letters'a'
,'b'
,'c'
, ... ,'z'
is given byscore[0]
,score[1]
, ... ,score[25]
respectively.ormExample 1:blog
Input: words = ["dog","cat","dad","good"], letters = ["a","a","c","d","d","d","g","o","o"],
score = [1,0,9,5,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0] Output: 23 Explanation: Score a=1, c=9, d=5, g=3, o=2 Given letters, we can form the words "dad" (5+1+5) and "good" (3+2+2+5) with a score of 23. Words "dad" and "dog" only get a score of 21.Example 2:leetcode
Input: words = ["xxxz","ax","bx","cx"], letters = ["z","a","b","c","x","x","x"],
score = [4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,10] Output: 27 Explanation: Score a=4, b=4, c=4, x=5, z=10 Given letters, we can form the words "ax" (4+5), "bx" (4+5) and "cx" (4+5) with a score of 27. Word "xxxz" only get a score of 25.Example 3:get
Input: words = ["leetcode"], letters = ["l","e","t","c","o","d"], score = [0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0] Output: 0 Explanation: Letter "e" can only be used once.Constraints:string
1 <= words.length <= 14
1 <= words[i].length <= 15
1 <= letters.length <= 100
letters[i].length == 1
score.length == 26
0 <= score[i] <= 10
words[i]
,letters[i]
contains only lower case English letters.
解題思路:這題也能算hard級別?words.length 最大才14,那麼總共有2^14次方種組合,全列舉出來求最大值便可。it
代碼以下:io
class Solution(object): def maxScoreWords(self, words, letters, score): """ :type words: List[str] :type letters: List[str] :type score: List[int] :rtype: int """ def checkValid(string,dic): for i in string: if i not in dic or string.count(i) > dic[i]: return False return True def calc(string,dic): uniq = set(list(string)) count = 0 for i in uniq: count += string.count(i) * score[ord(i) - ord('a')] return count dic = {} for i in letters: dic[i] = dic.setdefault(i,0) + 1 queue = [] for i in range(len(words)): if checkValid(words[i],dic): queue.append((i,words[i])) res = 0 while len(queue) > 0: inx,word = queue.pop(0) res = max(res,calc(word,dic)) for i in range(inx+1,len(words)): if checkValid(word + words[i],dic): queue.append((i,word + words[i])) return res