Easy

题目描述

给你一个下标从 0 开始的字符串 s,表示用户输入的字符串。改变按键定义为使用与上次使用的按键不同的按键。例如,s = "ab" 有一次改变按键,而 s = "bBBb" 没有改变按键。

返回用户必须改变按键的次数。

注意:像 shift 或 caps 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 只包含大写和小写英文字母。

提示:

  • 将所有字符转换为小写,然后返回字符与前一个字符不匹配的索引数量。

解题思路

这道题的核心在于理解"改变按键"的定义:只有当连续两个字符对应不同的字母时,才算改变按键。大小写不影响按键,即 ‘a’ 和 ‘A’ 使用同一个按键。

解题思路:

  1. 字符标准化:将所有字符转换为小写(或大写),消除大小写的影响
  2. 逐一比较:从第二个字符开始,将每个字符与前一个字符比较
  3. 计数统计:如果当前字符与前一个字符不同,说明发生了按键改变,计数器加1

算法步骤:

  • 初始化计数器为0
  • 遍历字符串(从索引1开始)
  • 对于每个位置,比较当前字符和前一个字符的小写形式
  • 如果不同,则计数器加1
  • 返回最终计数

这是一个简单的一遍扫描问题,时间复杂度为O(n),空间复杂度为O(1)。

代码实现

class Solution {
public:
    int countKeyChanges(string s) {
        int count = 0;
        for (int i = 1; i < s.length(); i++) {
            if (tolower(s[i]) != tolower(s[i-1])) {
                count++;
            }
        }
        return count;
    }
};
class Solution:
    def countKeyChanges(self, s: str) -> int:
        count = 0
        for i in range(1, len(s)):
            if s[i].lower() != s[i-1].lower():
                count += 1
        return count
public class Solution {
    public int CountKeyChanges(string s) {
        int count = 0;
        for (int i = 1; i < s.Length; i++) {
            if (char.ToLower(s[i]) != char.ToLower(s[i-1])) {
                count++;
            }
        }
        return count;
    }
}
var countKeyChanges = function(s) {
    let count = 0;
    for (let i = 1; i < s.length; i++) {
        if (s[i].toLowerCase() !== s[i-1].toLowerCase()) {
            count++;
        }
    }
    return count;
};

复杂度分析

复杂度
时间复杂度O(n)
空间复杂度O(1)