给你一个下标从 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
仅由英文大写字母和小写字母组成。
思路:按键变更是指这次的按键与上次的不同,我们会容易想到一个数据结构:栈,当我们遍历到一个字符,然后与栈顶元素比较一下是否相同,但这道题简化了,我们只需要找上一个字符,上上个字符是什么我们不关心(比如遍历到第三个字符,我们只关心第二个字符是什么,至于第一个字符是什么我们不用考虑),所以我们不用保存字符,所以可以不需要使用栈,可以很简单地就记录一下上一个字符,然后和当前遍历到的字符比较即可。
代码(Python):
class Solution(object):def countKeyChanges(self, s):result = s[0] #初始设为第一个字符number = 0 #记录按键变更的次数for i, str in enumerate(s[1:len(s)]): #从第二个字符开始遍历字符串sif result == str or abs(ord(str)-ord(result)) == 32:continue #如果字符相同或者只是大小写的区别,不计入次数else: #否则次数+1number +=1 result = str #更新result为 “上一个字符”return number