切换大小写最少次数
题目:输入一个字符串,键盘按键Caps Lock可以切换大小写模式,在大写模式下,若想输入小写字母,可以shift+字母,同样在小写模式下,若想输入大写字母可以shift+字母,给定一个字符串求最小的点按键击次数。注意:shift+字母算两次按键点击,默认初始状态是小写模式。
输入:‘AaAAA’
输出:7
解析: 这是一个动态规划问题,当前状态可以由前一个状态得到(但当前状态 capslock 是否开启是未知的,也就是说开启与否都可以)。设置一个状态矩阵分别存储caps关、caps开状态下需要的按键次数。
def min_button(strs, length):
if not strs:
return 0
# memo[0]、memo[1] 分别存储caps关、caps开状态下需要的按键次数
memo = [[0] * length for _ in range(2)]
for i in range(len(strs)):
if strs[i].isupper():
if i == 0:
memo[0][i] = 2
memo[1][i] = 1
else:
# memo[0][i]时,caps关,则memo[1][i-1]打完字母关caps,memo[0][i-1]需要按shift+字母
memo[0][i] = min(memo[0][i - 1] + 2, memo[1][i - 1] + 2)
# memo[0][i]时,caps开,则memo[1][i-1]直接打字母,memo[0][i-1]需要开caps后打字母
memo[1][i] = min(memo[0][i - 1] + 2, memo[1][i - 1] + 1)
else:
if i == 0:
memo[0][i] = 1
memo[1][i] = 2
else:
memo[0][i] = min(memo[0][i - 1] + 1, memo[1][i - 1] + 2)
memo[1][i] = min(memo[1][i - 1] + 2, memo[0][i - 1] + 2)
print(memo)
return min(memo[1][length - 1] + 1, memo[0][length - 1])
print(min_button('AaAAA', 5))