LeetCode 1255. Maximum Score Words Formed by Letters

1、原题目描述:

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.

2、简要翻译:

输入:字符串列表 words ,字符列表letters(给出允许出现的字符和个数的限制),分数列表 score (长度为26,代表每个字符的得分)

输出:用letters 中的字符拼接words 中的字符串,给出最大得分。

 

3、代码思路:

用回溯法遍历各种可能性,时间复杂度 O(2^n),可以使用一些剪枝的技巧。

 

4、JAVA代码实现:

private static int result;
    private static Map<String, Integer> scoreMap = null;
    private static int[] lettersNumber;

    public int maxScoreWords(String[] words, char[] letters, int[] score) {
        result = 0;
        scoreMap = new HashMap<>();
        lettersNumber = new int[26];
        char[] chars;
        int wordScore;
        for (String word : words) {
            chars = word.toCharArray();
            wordScore = 0;
            for (char aChar : chars) {
                wordScore += score[aChar - 'a'];
            }
            scoreMap.put(word, wordScore);
        }
        for (char letter : letters) {
            lettersNumber[letter - 'a']++;
        }
        Arrays.sort(words, (a, b) -> scoreMap.get(b) - scoreMap.get(a));
        dfsHelper(0, 0, words);
        return result;
    }

    private void dfsHelper(int score, int index, String[] words) {
        if (index >= words.length) {
            result = Math.max(result, score);
            return;
        }
        String word = words[index];
        if ((score + scoreMap.get(word) * (words.length - index)) <= result) {
            return;
        }
        char[] chars = word.toCharArray();
        int len = 0;
        for (char aChar : chars) {
            if (lettersNumber[aChar - 'a'] > 0) {
                lettersNumber[aChar - 'a']--;
                len++;
            } else {
                break;
            }
        }
        if (len == chars.length) {
            score += scoreMap.get(word);
            dfsHelper(score, index + 1, words);
            score -= scoreMap.get(word);
        }
        for (int i = 0; i < len; i++) {
            lettersNumber[chars[i] - 'a']++;
        }
        dfsHelper(score, index + 1, words);
    }

  

上一篇:CF978C Letters 题解


下一篇:[LeetCode] 917. Reverse Only Letters 只翻转字母