小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])
难度 : 简单