笔试编程题汇总(1)

"""
输入描述:一个字符串s,只包含b和w,分别表示黑色和白色,字符串长度不超过10^5。翻转操作定义为:将字符串在某个地方切开,将两个子串同时翻转后在拼接在一起。这个操作可以任意多次
输出:经过任意翻转操作,可以得到最大的连续黑白相间的子串的长度

样例:
    输入:
        bwbwb
    输出:
        5
样例:
    输入:
        bwbwbbw
    输出:
        7
"""
"""
基本思想:翻转操作只影响字符串的首尾,如果把字符串看做是首尾相接的(环形),那么翻转操作就不会对字符串有任何的影响。先将字符串分为黑白相间的子串,然后对首尾特殊处理,最后得到最长的子串(如果内存有要求,子串分割可以使用idx标记)
"""
import sys


def str_split(string):
    str_list = []
    idx_start = 0
    for idx in range(len(string)-1):
        if string[idx+1] == string[idx]:
            str_list.append(string[idx_start:idx+1])
            idx_start = idx+1
    str_list.append(string[idx_start:])

    if len(str_list)>=2 and str_list[-1][-1] != str_list[0][0]:
        str_list[0] += str_list.pop()
    return str_list

def get_max_bw(string):
    string_bw = str_split(string)
    len_all = [len(string_bw_temp) for string_bw_temp in string_bw]
    return max(len_all)

if __name__ == "__main__":
    # 读取第一行的n
    # n = int(sys.stdin.readline().strip())

    string = sys.stdin.readline().strip()
    print(get_max_bw(string))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值