1255. Maximum Score Words Formed by Letters
Hard
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | class Solution { class Word{ String word; int scr = 0; int[] chars = new int[26]; Word(String w, int[] score){ word = w; for(char c : w.toCharArray()){ chars[c-'a']++; scr += score[c-'a']; } } boolean isValid(int[] lettersCnt){ for(int i=0; i<26; ++i){ if(chars[i]>lettersCnt[i]) return false; } return true; } void update(int[] lettersCnt){ for(int i=0; i<26; ++i){ lettersCnt[i] -= chars[i]; } } } Word[] wordR; int n, maxScore = 0; public int maxScoreWords(String[] words, char[] letters, int[] score) { n = words.length; wordR = new Word[n]; for(int i=0; i<n; ++i){ wordR[i] = new Word(words[i], score); } int[] letterCnt = new int[26]; for(char c : letters) letterCnt[c-'a']++; dfs(0, 0, letters.length, letterCnt); return maxScore; } void dfs(int index, int currentScore, int leftChars, int[] lettersCnt){ if(index==n || leftChars==0){ return; }else{ for(int i=index; i<n; ++i){ if(wordR[i].isValid(lettersCnt)){ int[] tmp = lettersCnt.clone(); wordR[i].update(tmp); maxScore = Math.max(maxScore, currentScore+wordR[i].scr); dfs(i+1, currentScore+wordR[i].scr, leftChars-wordR[i].word.length(), tmp); } } } } } |
No comments:
Post a Comment