LeetCode //C - 1255. Maximum Score Words Formed by Letters

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 (wordsi 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 score0, score1, ... , score25 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 <= wordsi.length <= 15
  • 1 <= letters.length <= 100
  • lettersi.length == 1
  • score.length == 26
  • 0 <= scorei <= 10
  • wordsi, lettersi contains only lower case English letters.

From: LeetCode

Link: 1255. Maximum Score Words Formed by Letters


Solution:

Ideas:

DFS/backtracking. For each word, choose skip or take. Take only if enough letters remain. Since wordsSize <= 14, this 2^n solution is accepted.

Code:
c 复制代码
int dfs(int idx, char** words, int wordsSize, int cnt[26], int* score) {
    if (idx == wordsSize) return 0;

    // Option 1: skip this word
    int best = dfs(idx + 1, words, wordsSize, cnt, score);

    // Option 2: use this word if possible
    int need[26] = {0};
    int wordScore = 0;

    for (int i = 0; words[idx][i]; i++) {
        int c = words[idx][i] - 'a';
        need[c]++;
        wordScore += score[c];
    }

    int ok = 1;
    for (int i = 0; i < 26; i++) {
        if (need[i] > cnt[i]) {
            ok = 0;
            break;
        }
    }

    if (ok) {
        for (int i = 0; i < 26; i++) cnt[i] -= need[i];

        int take = wordScore + dfs(idx + 1, words, wordsSize, cnt, score);
        if (take > best) best = take;

        for (int i = 0; i < 26; i++) cnt[i] += need[i];
    }

    return best;
}

int maxScoreWords(char** words, int wordsSize, char* letters, int lettersSize, int* score, int scoreSize) {
    int cnt[26] = {0};

    for (int i = 0; i < lettersSize; i++) {
        cnt[letters[i] - 'a']++;
    }

    return dfs(0, words, wordsSize, cnt, score);
}
相关推荐
dialect_4 小时前
KMP算法
开发语言·c++·算法
reikocao4 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz4 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·5 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
文丑颜不良啊5 小时前
LeetCode1481~1500题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode1381~1400题目解析
java·leetcode
是main不是漫6 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
·present·6 小时前
CSAPP(Bomb lab)
c语言·c++
深圳市快瞳科技有限公司7 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真9 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法