📘 題目敘述
給你一個字串陣列 words,其中每個字串代表一個只包含小寫英文字母的單字。
你也會拿到一個長度為 26 的整數陣列 weights,其中 weights[i] 代表第 i 個小寫英文字母的權重。
一個單字的權重定義為:它所有字元的權重總和。
對每個單字,把它的權重對 26 取模,並用反向字母順序把結果對應到一個小寫字母(0 -> 'z', 1 -> 'y', ..., 25 -> 'a')。
請回傳一個字串,內容是依序把每個單字對應到的字母串接起來。
條件限制
1 <= words.length <= 1001 <= words[i].length <= 10weights.length == 261 <= weights[i] <= 100words[i]只包含小寫英文字母
🧠 解題思路
這題就是照題目描述做轉換,我的邏輯分成兩段:
第一段先算每個單字的權重。我把字元 c 轉成 0~25 的位置 pos = c - 'a',然後把 weights[pos] 加進總和。
第二段把總和對 26 取模,得到 check。題目規定 check 要用反向字母表映射:
0要變成'z'25要變成'a'
所以我用這個轉換式:
mapped = 'a' + (25 - check)
最後把每個單字的 mapped 字元依序加到 ans,回傳 ans。
所有變數
ans:最後要回傳的結果字串(把每個單字對應到的字母依序串起來)check:某個單字的權重總和(後面會再mod 26)pos:把某個字元轉成0~25的索引,用來查weights
🪜 主要流程步驟
1. 逐個處理 words 裡的單字
我用迴圈把 words 裡每個 s 拿出來,對每個單字都獨立算一次權重並轉成字母。
2. 計算單字權重總和 check
對某個單字 s:
- 先把
check設成0 - 掃過
s的每個字元 - 把字元轉成索引
pos = s[i] - 'a' check += weights[pos]
這樣 check 就是這個單字的權重。
3. 權重對 26 取模,得到映射用的數字
題目要的是 weight % 26,所以我做:
check %= 26
4. 用反向字母表把 check 轉成字元並加到答案
反向字母表的規則是 0 -> z ... 25 -> a。
所以我用:
ans += (char)(25 - check + 'a')
這樣就把對應字元加進 ans。
5. 回傳 ans
所有單字處理完後,ans 就是答案。
⏱️ 複雜度
- 時間複雜度:
O(totalLen)totalLen是所有單字長度總和,因為每個字元只會被掃過一次。 - 空間複雜度:
O(1)(不含輸出字串)
只用了固定幾個整數變數;輸出ans長度是words.length。
💻 程式碼實作
class Solution {
public:
string mapWordWeights(vector<string>& words, vector<int>& weights) {
string ans = "";
for (string s : words) {
int check = 0;
for (int i = 0; i < s.size(); i++) {
int pos = s[i] - 'a';
check += weights[pos];
}
check %= 26;
ans += (char)(25 - check + 'a');
}
return ans;
}
};
🔗 題目連結
https://leetcode.com/contest/biweekly-contest-176/problems/weighted-word-mapping/