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 <= 100s只包含大写和小写英文字母。
提示:
- 将所有字符转换为小写,然后返回字符与前一个字符不匹配的索引数量。
解题思路
这道题的核心在于理解"改变按键"的定义:只有当连续两个字符对应不同的字母时,才算改变按键。大小写不影响按键,即 ‘a’ 和 ‘A’ 使用同一个按键。
解题思路:
- 字符标准化:将所有字符转换为小写(或大写),消除大小写的影响
- 逐一比较:从第二个字符开始,将每个字符与前一个字符比较
- 计数统计:如果当前字符与前一个字符不同,说明发生了按键改变,计数器加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) |