【回溯】1255. 得分最高的單詞集合

本文涉及知識點

回溯
力扣難道:1881

LeetCode1255. 得分最高的單詞集合

你將會得到一份單詞表 words,一個字母表 letters (可能會有重復字母),以及每個字母對應的得分情況表 score。
請你幫忙計算玩家在單詞拼寫游戲中所能獲得的「最高得分」:能夠由 letters 里的字母拼寫出的 任意 屬于 words 單詞子集中,分數最高的單詞集合的得分。
單詞拼寫游戲的規則概述如下:
玩家需要用字母表 letters 里的字母來拼寫單詞表 words 中的單詞。
可以只使用字母表 letters 中的部分字母,但是每個字母最多被使用一次。
單詞表 words 中每個單詞只能計分(使用)一次。
根據字母得分情況表score,字母 ‘a’, ‘b’, ‘c’, … , ‘z’ 對應的得分分別為 score[0], score[1], …, score[25]。
本場游戲的「得分」是指:玩家所拼寫出的單詞集合里包含的所有字母的得分之和。
示例 1:
輸入: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]
輸出:23
解釋:
字母得分為 a=1, c=9, d=5, g=3, o=2
使用給定的字母表 letters,我們可以拼寫單詞 “dad” (5+1+5)和 “good” (3+2+2+5),得分為 23 。
而單詞 “dad” 和 “dog” 只能得到 21 分。
示例 2:

輸入: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]
輸出:27
解釋:
字母得分為 a=4, b=4, c=4, x=5, z=10
使用給定的字母表 letters,我們可以組成單詞 “ax” (4+5), “bx” (4+5) 和 “cx” (4+5) ,總得分為 27 。
單詞 “xxxz” 的得分僅為 25 。
示例 3:

輸入: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]
輸出:0
解釋:
字母 “e” 在字母表 letters 中只出現了一次,所以無法組成單詞表 words 中的單詞。

提示:
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] 只包含小寫的英文字母。

回溯

本題可以狀態壓縮動態規劃解決。本題解用回溯。
n = words.length
回溯的層次leve:n。
同層次的回溯:兩次回溯,word[leve]選擇,不選擇。
回溯的狀態: cnt[26]記錄剩余字符的數量,hasScore記錄已經獲取的分數。
回溯的調用:BackTrack(leve,0)
CanSub(cnt1[26],cnt2[26]) 需要的字符是否夠減。
Sub 減少。
Add 加。

回溯代碼

核心代碼

class Solution {
public:int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {int has[26] = { 0 };for (const auto& ch : letters) {has[ch - 'a']++;}int iRet = 0;std::function<void(int, int)> BackTrack = [&](int leve, int hasScore) {if (words.size() == leve) {iRet = max(iRet, hasScore);return;}			int cur[26] = { 0 };Init(cur, words[leve]);if (CanSub(has, cur)) {Sub(has, cur);int curScore = 0;for (int i = 0; i < 26; i++) {curScore += cur[i] * score[i];}BackTrack(leve + 1, hasScore+ curScore);Add(has, cur);}BackTrack(leve + 1, hasScore);};BackTrack(0, 0);return iRet;}void Init(int* s, const string& str) {for (const auto& ch : str) {s[ch - 'a']++;}}bool CanSub(int* s1, int* s2) {for (int i = 0; i < 26; i++) {if (s1[i] < s2[i]) { return false; }}return true;}void Sub(int* s1, int* s2) {for (int i = 0; i < 26; i++) {s1[i] -= s2[i];}	}void Add(int* s1, int* s2) {for (int i = 0; i < 26; i++) {s1[i] += s2[i];}}
};

測試用例

class Solution {
public:int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {int has[26] = { 0 };for (const auto& ch : letters) {has[ch - 'a']++;}int iRet = 0;std::function<void(int, int)> BackTrack = [&](int leve, int hasScore) {if (words.size() == leve) {iRet = max(iRet, hasScore);return;}			int cur[26] = { 0 };Init(cur, words[leve]);if (CanSub(has, cur)) {Sub(has, cur);int curScore = 0;for (int i = 0; i < 26; i++) {curScore += cur[i] * score[i];}BackTrack(leve + 1, hasScore+ curScore);Add(has, cur);}BackTrack(leve + 1, hasScore);};BackTrack(0, 0);return iRet;}void Init(int* s, const string& str) {for (const auto& ch : str) {s[ch - 'a']++;}}bool CanSub(int* s1, int* s2) {for (int i = 0; i < 26; i++) {if (s1[i] < s2[i]) { return false; }}return true;}void Sub(int* s1, int* s2) {for (int i = 0; i < 26; i++) {s1[i] -= s2[i];}	}void Add(int* s1, int* s2) {for (int i = 0; i < 26; i++) {s1[i] += s2[i];}}
};

2023年1月

//通過 x &= (x-1)實現
int bitcount(unsigned x) {
int countx = 0;
while (x) {
countx++;
x &= (x - 1);
}
return countx;
}

class Solution {
public:
int maxScoreWords(vector& words, vector& letters, vector& score) {
vector vCharNums(26);
for (const auto& ch : letters)
{
vCharNums[ch - ‘a’]++;
}
vector vScore(words.size());
for (int i = 0; i < words.size(); i++)
{
for (const auto& ch : words[i])
{
vScore[i] += score[ch - ‘a’];
}
}
m_iUseWordMaskNum = 1 << words.size();
m_vMaskCharNums.assign(m_iUseWordMaskNum, vector(26));
//只選擇一個words
for (int i = 0; i < words.size(); i++)
{
auto& v = m_vMaskCharNums[1<<i];
for (const auto& ch : words[i])
{
v[ch - ‘a’]++;
}
}
//多個字符 words
for (int iMask = 1; iMask < m_iUseWordMaskNum; iMask++)
{
if (1 == bitcount(iMask))
{
continue;
}
int iSumMask = (iMask - 1)&iMask;
int iSumMask2 = iMask - iSumMask;
for (int j = 0; j < 26; j++)
{
m_vMaskCharNums[iMask][j] = m_vMaskCharNums[iSumMask][j] + m_vMaskCharNums[iSumMask2][j];
}
}
int iMaxScore = 0;
for (int iMask = 1; iMask < m_iUseWordMaskNum; iMask++)
{
bool bVilid = true;
for (int j = 0; j < 26; j++)
{
if (m_vMaskCharNums[iMask][j] > vCharNums[j])
{
bVilid = false;
break;
}
}
if (bVilid)
{
int iSorce = 0;
for (int i = 0; i < words.size(); i++)
{
if (iMask & (1 << i))
{
iSorce += vScore[i];
}
}
iMaxScore = max(iMaxScore, iSorce);
}
}
return iMaxScore;
}
int m_iUseWordMaskNum;
vector<vector> m_vMaskCharNums;

};

2023年7月

class Solution {
public:
int maxScoreWords(vector& words, vector& letters, vector& score) {
m_c = words.size();
vector vHasChar(26);
for (const auto& ch : letters)
{
vHasChar[ch - ‘a’]++;
}
int iRet = 0;
const int iMaskNum = 1 << m_c;
for (int mask = 0; mask < iMaskNum; mask++)
{
int needChar[26] = { 0 };
for (int j = 0; j < m_c; j++)
{
if (mask & (1 << j))
{
for (const char& ch : words[j])
{
needChar[ch - ‘a’]++;
}
}
}
//字符不足
bool bEnough = true;
int iScource = 0;
for (int j = 0; j < 26; j++)
{
bEnough &= (needChar[j] <= vHasChar[j]);
iScource += score[j] * needChar[j];
}
if (bEnough)
{
iRet = max(iRet, iScource);
}
}
return iRet;
}
int m_c;
};

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
《喜缺全書算法冊》以原理、正確性證明、總結為主。
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12707.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql常見數據類型探索

Mysql常見數據類型探索 數值類型 MySQL 支持所有標準 SQL 數值數據類型。 這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC)&#xff0c;以及近似數值數據類型(FLOAT、REAL 和 DOUBLE PRECISION)。 關鍵字INT是INTEGER的同義詞&#xff0c;關鍵字DEC是…

K8s 二進制部署 上篇

一 K8S按裝部署方式&#xff1a; ① Minikube Minikube是一個工具&#xff0c;可以在本地快速運行一個單節點微型K8S&#xff0c;僅用于學習、預覽K8S的一些特 性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一個工…

vue網頁端控制臺展示獨有標記

效果展示 實現步驟 1. 新建js文件 定義一個類 用于提供控制臺打印日志顯示樣式的方法 src\libs\util.log.js class Logger {// 定義靜態方法static typeColor(type "default") {let color "";switch (type) {case "default":color "#3…

后臺菜單數據遞歸展示

后臺菜單數據遞歸展示 效果示例圖aslide.vueaslideItem.vuemenu 效果示例圖 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

MIRO時,修改頁簽“采購訂單參考”的數量時,金額不自動計算

MIRO 發票校驗時&#xff0c;進入到如下界面&#xff0c;系統參考采購訂單自動帶出已經收貨的金額和數量。 此時如果想要修改數量時&#xff0c;有些用戶賬號下&#xff0c;金額不自動計算&#xff0c;但是有些用戶賬號下&#xff0c;數量更改時&#xff0c;系統自動計算和建議…

“普惠門診保”24年升級回歸! 您醫保的有效商業補充!

2024年5月15日&#xff0c; “普惠門診保如意版”正式官宣發布&#xff01; 2023年&#xff0c;中國人民財產保險股份有限公司湖南省分公司積極創新的惠民型商業補充醫療保險&#xff0c;推出湖南省內首款互聯網門診醫療保險“普惠門診保” 2024年&#xff0c;在去年保障內容…

窮人翻身的秘訣!2024年普通人如何創業賺錢?窮人如何逆襲翻身?普通人創業新風口?

窮人的思維有一個致命的缺陷&#xff0c;就是追求確定性&#xff0c;進而失去了可能性。而賺錢的真相實際上非常殘酷。世界上能夠賺錢的事情必定是不確定的&#xff0c;能夠賺取巨額財富的事情更是極度不確定的。只有面對不確定性&#xff0c;才能讓你把競爭對手攔在門外&#…

如何在 Linux 上檢查 CPU 和硬盤溫度

為了更好地監測您的Linux系統的硬件健康狀況&#xff0c;如CPU與硬盤溫度、風扇轉速等關鍵指標&#xff0c;采用lm_sensors與hddtemp這兩款強大工具是明智之選。以下是關于這些工具的詳盡指南&#xff0c;包括它們的功能介紹、安裝步驟以及如何配置lm_sensors&#xff0c;旨在為…

ASCLL碼表以及字符的相加減

ASCLL碼表完整版及解釋_acssll碼-CSDN博客 #include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5];int isdigit(int c) {if (c > 0 && c < 9)return 1;return 0; }int main(int argc…

【TypeScript】對象類型的定義

簡言 在 JavaScript 中&#xff0c;我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中&#xff0c;我們通過對象類型來表示這些對象。 對象類型 在 JavaScript 中&#xff0c;我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中&#xff0c;我們通過對象類…

Blender雕刻建模_筆刷紋理和頂點繪制

筆刷紋理 主要用于皮膚&#xff0c;紋理的雕刻。 可以修改映射方式來實現不同繪制效果。 用一張紋理來定義筆刷各個點的強度。其中白色為1&#xff0c;黑色為0。 設置筆刷紋理步驟&#xff1a; -新建一套筆刷 -強度&#xff0c;設為0.15&#xff08;可以根據需求修改&#x…

Visual Studio中的內存檢測工具:程序員的必備神器

在軟件開發的廣闊海洋中&#xff0c;Visual Studio&#xff08;VS&#xff09;如同一位全能的船長&#xff0c;不僅提供了豐富的代碼編輯和調試功能&#xff0c;還內置了多種實用的開發工具&#xff0c;其中內存檢測工具更是程序員定位和解決內存泄漏問題的得力助手。本文將詳細…

ACWing471. 棋盤-DFS剪枝

題目 思路 本思路參考博客AcWing 471. 棋盤 - AcWing 約束方程&#xff1a; 代碼 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

接口自動化-requests庫

requests庫是用來發送請求的庫&#xff0c;本篇用來講解requests庫的基本使用。 1.安裝requests庫 pip install requests 2.requests庫底層方法的調用邏輯 &#xff08;1&#xff09;get / post / put / delete 四種方法底層調用 request方法 注意&#xff1a;data和json都…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 駕校管理系統 設計與實現

一.項目介紹 系統角色&#xff1a;管理員、駕校教練、學員 管理員&#xff1a; 個人中心&#xff1a;修改密碼以及個人信息修改 學員管理&#xff1a;維護學員信息&#xff0c;維護學員成績信息 駕校教練管理&#xff1a;駕校教練信息的維護 駕校車輛管理&…

在Python中,f代表著格式化字符串

在Python中&#xff0c;f代表著格式化字符串&#xff08;Formatted String&#xff09;。格式化字符串是一種方便的字符串表示形式&#xff0c;它允許您在字符串中包含變量值&#xff0c;并在運行時將其替換為實際值。使用格式化字符串&#xff0c;您可以更輕松地構建復雜的字符…

java排課算法簡單demo

簡化的場景設定 有限的教室數量。每個教師可以教授多個課程。每個課程在一個特定的時間段內只能安排一次。考慮教室容量和課程需求。 Java代碼實現 首先&#xff0c;我們定義幾個基本的類&#xff1a;Course、Teacher、Room 和 TimeSlot。 import java.util.ArrayList; imp…

【R語言】ggplot中點的樣式shape參數匯總

ggplot中點的樣式展示&#xff1a; library(ggplot2)# 創建數據框 a<- data.frame(x 0:25, y 0:25) # 創建散點圖 ggplot(a, aes(x x, y y, shape as.factor(y))) geom_point(size 4) scale_shape_manual(values 0:25) labs(shape "形狀") theme(legend.…

產品經理如何進行項目管理?

產品經理如何進行項目管理&#xff1f; 項目管理和產品管理在本質上還是有一定差別的。產品更關注的是產品、功能、方向和反饋&#xff0c;而項目則更關注進度、質量和測試等。如果團隊沒有項目經理&#xff0c;那么產品經理就需要兼顧對開發人員、項目進度等進行管理。 此時…

K8S搭建

文章目錄 K8S搭建配置要求 安裝 Kuboard-Spray加載離線資源包規劃并安裝集群訪問集群重啟Kubernetes集群Worker節點不能啟動許多Pod一直Crash或不能正常訪問 containerd配置網絡代理 常用的 kubectl 命令&#xff1a; K8S搭建 安裝高可用的Kubernetes集群 配置要求 對于 Kub…