有一个打字员,他打字的时候有个习惯,从来不用 Shift 来切换大小写,只用 Caps Lock。 现在给他一个地铁站的名字,你需要写一个程序来告诉他,他需要敲击多少下键盘才能打出 这个地铁站名。

第一行输入一个数字 n (n<1000),表示共有多少个需要处理的车站名。从第 2 到第 n+1 行是这 n 个车站名。车站名由英文字母构成,名字的长度不会超过 100 个字符。已知开始时 键盘是输入小写字母的状态。
输出
这个打字员敲击键盘的次数。
样例输入
5
BeiJingDaXueDongMen
AAAaaaBBBbbbABAB
AmericanRAILWAY
AaAaAa
DFjfkdaB
样例输出
31
21
18
12
11
谁能帮助我一下,这个算法?谢谢了c语言c#c++

解决方案 »

  1.   

    模拟人工输入,默认是小写
    然后从左到右读字符串,一个flag标记当前大小写状态
    如果状态一致,每打一个字母,按键一次,如果状态不一致,按键次数加1(按caps lock)
    统计完了就是次数.
    python测试
    cases = ['abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ']
    def hit_key(s,i=0):
        if len(s)==0:
            return 0
        elif len(s)==1:
            return 1+(s[0] not in cases[i] and 1 or 0)
        else:
            if s[0] in cases[i]:
                return 1+hit_key(s[1:],i)
            else:
                return 2+hit_key(s[1:],1-i)def main():
        s = ['BeiJingDaXueDongMen','AAAaaaBBBbbbABAB','AmericanRAILWAY','AaAaAa','DFjfkdaB']
        d = {x:hit_key(x,0) for x in s}
        for k in s:
            print d[k],k
    结果:
    main()
    31 BeiJingDaXueDongMen
    21 AAAaaaBBBbbbABAB
    18 AmericanRAILWAY
    12 AaAaAa
    11 DFjfkdaB
      

  2.   

    将大写设定为1, 小写设定为0,以你的样本为例
    BeiJingDaXueDongMen //源数据
    1001000101001000100 //大小写状态
    0101100111101100110 //下一行算法得到的结果,为了便于你观察才提前一点
    将这个状态进行如下算法:将当前值与上一值进行相减并取绝对值,即可得到上一行数据
    将这个值相加,则是变化的数量。再加上字节长度,就是击键数
    还要考虑一下初始状态,如:必须是从CAP关闭状态开始的话,则可能第1位要计算成1。 还有最后一位,是否必须将CAP设置为开或关,或者不管它