Bảng băm
127. Chuỗi từ chuyển đổi
Bài toán
Từ điển
wordListchứa một chuỗi từbeginWordđếnendWordvới dãy chuyển đổi được tạo theo các quy tắc sau:beginWord -> s(1) -> s(2) -> ... -> s(k):
- Mỗi cặp từ kề nhau chỉ khác nhau bởi một ký tự.
- Đối với
1 <= i <= k, mỗis(i)đều nằm trongwordList. Lưu ý rằng,beginWordkhông cần phải có trongwordList.s(k) == endWordCho hai từ
beginWordvàendWordcùng với từ điểnwordList, hãy trả về số lượng từ trong dãy chuyển đổi ngắn nhất từbeginWordđếnendWord. Nếu không tồn tại dãy như vậy, trả về0.
/**
* @param {string} start
* @param {string} target
* @param {string[]} dict
* @return {number}
*/
var shortestTransformation = function (start, target, dict) {
if (!dict.includes(target)) return 0;
let wordSet = new Set(dict);
let queue = [[start, 1]];
while (queue.length > 0) {
let [current, steps] = queue.shift();
if (current === target) return steps;
for (let i = 0; i < current.length; i++) {
for (let charCode = 97; charCode <= 122; charCode++) {
let nextWord = current.slice(0, i) + String.fromCharCode(charCode) + current.slice(i + 1);
if (wordSet.has(nextWord)) {
queue.push([nextWord, steps + 1]);
wordSet.delete(nextWord);
}
}
}
}
return 0;
};
140. Phân tách từ II
Bài toán
Cho một chuỗi
textvà một danh sách từvocab, hãy chèn dấu cách vào chuỗitextđể tạo thành câu sao cho tất cả các từ đều xuất hiện trong từ điển. Trả về tất cả các khả năng phân tách theo thứ tự tùy chọn.
/**
* @param {string} text
* @param {string[]} vocab
* @return {string[]}
*/
var splitWords = function (text, vocab) {
const memo = new Map();
const wordSet = new Set(vocab);
function backtrack(index) {
if (memo.has(index)) return memo.get(index);
if (index === text.length) return [[]];
let results = [];
for (let i = index + 1; i <= text.length; i++) {
let prefix = text.slice(index, i);
if (wordSet.has(prefix)) {
let suffixes = backtrack(i);
for (let suffix of suffixes) {
results.push([prefix].concat(suffix));
}
}
}
memo.set(index, results);
return results;
}
return backtrack(0).map(sent => sent.join(' '));
};
383. Tín phiếu chuộc tội
Bài toán
Kiểm tra xem chuỗi
notecó thể được tạo ra từ các ký tự của chuỗisourcehay không. Mỗi ký tự trongsourcechỉ được sử dụng một lần.
/**
* @param {string} note
* @param {string} source
* @return {boolean}
*/
var canBuildNote = function (note, source) {
let countMap = {};
for (let char of source) {
countMap[char] = (countMap[char] || 0) + 1;
}
for (let char of note) {
if (!countMap[char]) return false;
countMap[char]--;
}
return true;
};
2103. Vòng và que
Bài toán
Có
nvòng màu đỏ, xanh lá hoặc xanh dương được đặt trên 10 que đánh số từ0đến9. Hãy tìm số que mà trên đó có đủ cả ba màu vòng.
/**
* @param {string} rings
* @return {number}
*/
var countCompleteRods = function (rings) {
let rodStatus = Array(10).fill(0);
for (let i = 0; i < rings.length; i += 2) {
let color = rings[i];
let rod = rings[i + 1];
switch (color) {
case 'R': rodStatus[rod] |= 1; break;
case 'G': rodStatus[rod] |= 2; break;
case 'B': rodStatus[rod] |= 4; break;
}
}
return rodStatus.filter(status => status === 7).length;
};
2744. Số cặp chuỗi tối đa
Bài toán
Tìm số cặp tối đa giữa các từ trong mảng
wordssao cho một từ là phiên bản đảo ngược của từ kia.
/**
* @param {string[]} words
* @return {number}
*/
var maxMatchingPairs = function (words) {
let seen = new Set();
let pairs = 0;
for (let word of words) {
let reversed = word.split('').reverse().join('');
if (seen.has(reversed)) {
pairs++;
seen.delete(reversed);
} else {
seen.add(word);
}
}
return pairs;
};
3158. XOR của các số xuất hiện hai lần
Bài toán
Trả về giá trị XOR của tất cả các số xuất hiện hai lần trong mảng
nums.
/**
* @param {number[]} nums
* @return {number}
*/
var xorOfDuplicates = function (nums) {
let counts = {};
for (let num of nums) {
counts[num] = (counts[num] || 0) + 1;
}
let result = 0;
for (let [num, freq] of Object.entries(counts)) {
if (freq === 2) result ^= num;
}
return result;
};