一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:K 次操作转变字符串
难度:中等
题目要求:
给你两个字符串 s 和 t ,你的目标是在 k 次操作以内把字符串 s 转变成 t 。
在第 i 次操作时(1 <= i <= k),你可以选择进行如下操作:
- 选择字符串 s 中满足 1 <= j <= s.length 且之前未被选过的任意下标 j (下标从 1 开始),并将此位置的字符切换 i 次。
- 不进行任何操作。 切换 1 个字符的意思是用字母表中该字母的下一个字母替换它(字母表环状接起来,所以 'z' 切换后会变成 'a')。第 i 次操作意味着该字符应切换 i 次
请记住任意一个下标 j 最多只能被操作 1 次。
如果在不超过 k 次操作内可以把字符串 s 转变成 t ,那么请你返回 true ,否则请你返回 false 。
举个例子
输入:s = "input", t = "ouput", k = 9
输出:true
解释:第 6 次操作时,我们将 'i' 切换 6 次得到 'o' 。第 7 次操作时,我们将 'n' 切换 7 次得到 'u' 。
:解题
方法一 :
解题思路:
s字符串遍历,每一个字符在1-k中都有可转换为t的值,通过charCodeAt方法取t[i]与s[i] 差值c
如何判断c已经被用过,记录obj[c] 存在,并且记录次数
多次使用c时,满足k>obj[c]*26 +c 即可
编辑代码:
var canConvertString = function (s, t, k) {
if (s.length !== t.length) {
return false
}
let obj = {};
for (var i = 0; i < s.length; i++) {
let a = s[i].charCodeAt()
let b = t[i].charCodeAt()
if (a === b) {
continue
}
let c = b - a
let temp = null
if (c > k) {
return false
}
if (c < 0) {
c = c + 26
}
if (obj[c]) {
temp = c
c = obj[c] * 26 + c
}
if (c > k) {
return false
}
if (temp) {
obj[temp] = obj[temp] + 1
} else {
obj[c] = 1
}
}
return true
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。