【leetcode】1255. Maximum Score Words Formed by Letters

时间:2019-11-12
本文章向大家介绍【leetcode】1255. Maximum Score Words Formed by Letters,主要包括【leetcode】1255. Maximum Score Words Formed by Letters使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目如下:

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

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).

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.

Example 1:

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:

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:

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:

  • 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次方种组合,全列举出来求最大值即可。

代码如下:

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

原文地址:https://www.cnblogs.com/seyjs/p/11841269.html