题目简述:给定字符串s,要求将s在k步之内生成一个字典序最小的字符串t。a - b的步数为1,a - z的步数也为1。
贪心算法
这一题的思路没有那么绕,遍历字符串,将当前字符currentChar与'a'还有'z'比较,看到达哪个比较近,且距离小于k,这样就可以把currentChar = 'a',如果当前剩余的距离大于k,那就将currentChar往'a'的方向走剩余的步数即可。
var getSmallestString = function (s, k) {
let aNum = 'a'.charCodeAt(0)
let zNum = 'z'.charCodeAt(0)
// 因为 js的字符串 不能被修改,所以另外用数组来进行操作
let sArray = s.split('')
for (let i = 0; i < s.length; ++i) {
// 当前字符分别与 ‘a’,‘z’比较,取出最小的步数
// 假设当前字符为 ‘z’,那么 ‘z’ 到 ‘a’ 的距离就是 1,所以需要 + 1的操作
let minDis = Math.min(zNum - s[i].charCodeAt(0) + 1, s[i].charCodeAt(0) - aNum)
if (k >= minDis) {
// 剩余步数 k 大于 最小距离的时候,就可以将当前的字符置为 ‘a’
sArray[i] = 'a'
k -= minDis
} else {
// 剩余步数不足以到达 ‘a’ 时,那么就往回走(往 ‘a’ 的方向走)k 步即可
sArray[i] = String.fromCharCode(s[i].charCodeAt(0) - k)
break
}
}
return sArray.join('')
};