文章

[LeetCode] 每日一题 3019. 按键变更的次数

题目链接

https://leetcode.cn/problems/number-of-changing-keys

题目描述

给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s = "ab" 表示按键变更一次,而 s = "bBBb" 不存在按键变更。

返回用户输入过程中按键变更的次数。

注意:shiftcaps lock 等修饰键不计入按键变更,也就是说,如果用户先输入字母 'a' 然后输入字母 'A' ,不算作按键变更。

示例输入

示例 1

输入:s = "aAbBcC"

输出:2

解释: 
从 s[0] = 'a' 到 s[1] = 'A',不存在按键变更,因为不计入 caps lock 或 shift 。
从 s[1] = 'A' 到 s[2] = 'b',按键变更。
从 s[2] = 'b' 到 s[3] = 'B',不存在按键变更,因为不计入 caps lock 或 shift 。
从 s[3] = 'B' 到 s[4] = 'c',按键变更。
从 s[4] = 'c' 到 s[5] = 'C',不存在按键变更,因为不计入 caps lock 或 shift 。

示例 2

输入:s = "AaAaAaaA"

输出:0

解释: 不存在按键变更,因为这个过程中只按下字母 'a' 和 'A' ,不需要进行按键变更。

提示

  • 1 <= s.length <= 100

  • s 仅由英文大写字母和小写字母组成。

题解

解题思路

本题的关键在于判断两个连续字符是否来自不同的按键组。由于题目说明忽略大小写差异,因此可以利用 ASCII 值的特点解决此问题:

  1. 字母的大小写之间的 ASCII 值差为 32(如 'a' 和 'A' 的差值为 32)

  2. 如果相邻两个字符相等,或它们的差值为 32,则无需变更按键

  3. 否则,即使用了不同的按键,按键变更次数增加

通过遍历字符串中的每个字符并比较当前字符与前一个字符的关系,可以高效完成统计

代码实现

class Solution {
    public int countKeyChanges(String s) {
        int ans = 0;
        for (int i = 1; i < s.length(); i++) {
            if (Math.abs(s.charAt(i - 1) - s.charAt(i)) == 32 || s.charAt(i - 1) == s.charAt(i)) {
                continue;
            }
            ans++;
        }
        return ans;
    }
}

复杂度分析

  1. 时间复杂度
    遍历字符串需要 O(n) 的时间,其中 n 是字符串的长度。在每次迭代中进行简单的比较操作,因此整体时间复杂度为 O(n)

  2. 空间复杂度
    代码中未使用额外的数据结构,仅用到了常数级的变量存储,空间复杂度为 O(1)

总结

该题通过比较相邻字符的 ASCII 值关系,有效地判断按键是否变更,利用大小写字母的特性简化了逻辑

希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。

License:  CC BY 4.0