【面试题】网易互娱(游戏)2020校招在线笔试-游戏研发第一批[幸运N串]

小A很喜欢字母N,他认为连续的N串是他的幸运串。有一天小A看到了一个全部由大写字母组成的字符串,他被允许改变最多2个大写字母(也允许不改变或者只改变1个大写字母),使得字符串中所包含的最长的连续的N串的长度最长。你能帮助他吗?


输入描述:

输入的第一行是一个正整数T(0 < T <= 20),表示有T组测试数据。对于每一个测试数据包含一行大写字符串S(0 < |S| <= 50000,|S|表示字符串长度)。

数据范围:

20%的数据中,字符串长度不超过100;

70%的数据中,字符串长度不超过1000;

100%的数据中,字符串长度不超过50000。

输出描述:

对于每一组测试样例,输出一个整数,表示操作后包含的最长的连续N串的长度。

输入例子1:

3
NNTN
NNNNGGNNNN
NGNNNNGNNNNNNNNSNNNN

输出例子1:

4
10
18

网易游戏的题目都还是很好懂的,基本不会有歧义。

首先我们把子串分为两种情况考虑

情况一:非N字符的个数<=2  。    这种情况下直接返回字符串长度即可

情况二:非N字符的个数>2    。    那么我们需要对字符串进行补“N”操作

              由于是求最大连续子串,那么补的N必定是连续的,所以我们必须通过一次for循环先把字符串中非N字符的下标全部找                  出来。随后只需要对非N字符的下标进行“隔3相减”,即可获得连续为N的子串

              这里还有一个常识需要注意,例如【2,3,4,5,6,7】,

              虽然7 - 2 = 5,但实际上2与7之间只相隔了【3,4,5,6】四个元素,故子串长度应该为list[n+3] - list[n] -1

代码如下:

m = int(input())
data = []                            
 
for i in range(m):
    data.append(input())
 
for i in range(m):
    n=[]                                             #储存非N字符的下标           
    n.append(-1)                                     #第一个元素为-1(方便后续隔3相减)
    for j in range(len(data[i])):                    #遍历字符串
        if data[i][j] != 'N':        
            n.append(j)                     
    n.append(len(data[i]))                           #最后一个元素为 data[i] (方便后续隔3相减)      
    if len(n)<=4:
        print(len(data[i]))                          #如果非N字符小于2
    else:
        max = 0                                      #最大子串长度
        for x in range(0, len(n)-3):
            if n[x + 3] - n[x] -1 > max:             #隔3相减
                max = n[x + 3] - n[x]-1
        print(max)

#假设字符串为 CJNA  则n=[0,1,3]
#第一次计算最大子串应该是将data[i][0]与data[i][1]替换为N
#但由于data[i][0]是第一位,无法进行隔3运算
#所以必须在首位加一个数来方便处理第一个字符非N的情况
#假设现在n=[m,0,1,3],此时进行隔三运算,max = 3 - m -1
#将补N字符带入原字符串可知(NNNA),此时最大子串长度为3
#3-m-1 = 3  得 m = -1
#故必须在首位添加 -1

#假设字符串为 ANAA  则n=[-1,0,2,3]
#第一次计算最大子串应该是将data[i][2]与data[i][3]替换为N
#但由于data[i][3]是最后位,无法进行隔3运算
#所以必须在末位加一个数来方便处理第一个字符非N的情况
#假设现在n=[-1,0,2,3,m],此时进行隔三运算,max = m - 0 -1
#将补N字符带入原字符串可知(ANNN),此时最大子串长度为3
#m - 0 -1 = 3  得 m = len(data[i])
#故必须在末位添加len(data[i])

难度 : 简单

              

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值