每日一题 -- LeetCode1540

103 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情image.png

前言

每日一题,轻松解题

每日一题为刷题系列 每日刷一题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
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。