输入字符串最少按键次数

Posted by 王院长 on September 26, 2019

切换大小写最少次数

题目:输入一个字符串,键盘按键Caps Lock可以切换大小写模式,在大写模式下,若想输入小写字母,可以shift+字母,同样在小写模式下,若想输入大写字母可以shift+字母,给定一个字符串求最小的点按键击次数。注意:shift+字母算两次按键点击,默认初始状态是小写模式。

输入:‘AaAAA’

输出:7

解析: 这是一个动态规划问题,当前状态可以由前一个状态得到(但当前状态 capslock 是否开启是未知的,也就是说开启与否都可以)。设置一个状态矩阵分别存储caps关、caps开状态下需要的按键次数。

image

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))