网易互娱笔试题-幸运N串

题目描述:

连续N串被认为是幸运串,给一个全部由大写字母组成的字符串,允许改变最多两个大写字母(也允许不改变或改变1个大写字母),
是的字符串中包含的最长的连续N串的长度最大。
输入:T 表示有T组用例
每一行用例包含一行大写字符串S(0<|S|<50000,|S|为字符串长度
输出:
每一个测试用例,输出一个整数,表示操作后包含的最长连续N串的长度
比如:
输入
3
NNGN
NNNNGGNNNN
NGNNNNGNNNNNNNNSNNNN
输出:
4
10
18

思路:

双指针,滑动窗口,当窗口内非N小于2的时候,可以一直更新最大N串的长度,当非N串大于2时,滑动窗口左指针,直到非N串数目小于2,然后更新最大长度。

import sys
def count(line):
    # 左边界
    l = 0
    count_n = 0  #用来统计当前窗口内N的个数
    res = 0
    for r, char in enumerate(line):

        if char == 'N':
            count_n += 1
        # 最多2个改变:r-l+1表示窗口大小,在窗口大小中如果非N的数目大于2,则滑动窗口左指针,直到窗口内的非N小于2
        while r - l + 1 - count_n > 2:
            if line[l] == 'N':
                count_n -= 1
            l += 1
        res = max(res, r - l + 1)
    return res


if __name__ == "__main__":
    # 读取第一行的n
    n = int(sys.stdin.readline().strip())
    ans = []
    for i in range(n):
        # 读取每一行
        v = str(sys.stdin.readline().strip())
        ans.append(count(v))
    for i in ans:
        print(i)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值