Back to all solutions
#1540 - Can Convert String in K Moves
Problem Description
Given two strings s and t, your goal is to convert s into t in k moves or less.
During the ith (1 <= i <= k) move you can:
- Choose any index j (1-indexed) from s, such that 1 <= j <= s.length and j has not been chosen in any previous move, and shift the character at that index i times.
- Do nothing.
Shifting a character means replacing it by the next letter in the alphabet (wrapping around so that 'z' becomes 'a'). Shifting a character by i means applying the shift operations i times.
Remember that any index j can be picked at most once.
Return true if it's possible to convert s into t in no more than k moves, otherwise return false.
Solution
/**
* @param {string} s
* @param {string} t
* @param {number} k
* @return {boolean}
*/
var canConvertString = function(source, target, maxMoves) {
if (source.length !== target.length) return false;
const shiftCounts = new Array(26).fill(0);
for (let i = 0; i < source.length; i++) {
const shiftNeeded = (target.charCodeAt(i) - source.charCodeAt(i) + 26) % 26;
if (shiftNeeded > 0) {
shiftCounts[shiftNeeded]++;
}
}
for (let shift = 1; shift < 26; shift++) {
if (shiftCounts[shift] === 0) continue;
const totalMoves = shift + 26 * (shiftCounts[shift] - 1);
if (totalMoves > maxMoves) return false;
}
return true;
};