【leetcode】1255. Maximum Score Words Formed by Letters

題目以下:app

Given a list of words, list of  single letters (might be repeating) and score of every character.spa

Return the maximum score of any valid set of words formed by using the given letters (words[i] cannot be used two or more times).code

It 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 by score[0]score[1], ... , score[25] respectively.orm

Example 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
相關文章
相關標籤/搜索