描述: 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的 GC-Ratio 可能是基因的起始点。给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等,但是没有 AGT , CT 等等
数据范围:字符串长度满足 1 \le n \le 1000 \1≤n≤1000 ,输入的字符串只包含 A/C/G/T 字母
输入描述:输入一个string型基因序列,和int型子串的长度
输出描述:找出GC比例最高的子串,如果有多个则输出第一个的子串
示例1-输入:
ACGT
2
输出:CG
说明:ACGT长度为2的子串有AC,CG,GT3个,其中AC和GT2个的GC-Ratio都为0.5,CG为1,故输出CG
示例2-输入:
AACTGTGCACGACCTGA
5
输出:GCACG
说明:虽然CGACC的GC-Ratio也是最高,但它是从左往右找到的GC-Ratio最高的第2个子串,所以只能输出GCACG。
运行时间:41ms 超过90.19% 用Python 3提交的代码
占用内存:4676KB 超过17.36%用Python 3提交的代码
# 1/inputstrip-stra,num-def
# 2/forilen-每个起始的stra取i:i+5往后取
# 3/每个子串判断是G和C在子串的个数,再除以子串长度,得到子串对应的values-dic值
# 4/sorte-dic-rev倒序-以dic.items-x1排序,取第一个最大的,如有相等则不能倒序,此时比较好获取最大max占比rat值
# 5/sorted-rev倒序找最大maxRat可以,但输出还是得for循环,因为题目要求保留第一个即可
def exam(stra,num):
stra = stra
num = num
res = []
# 以第一个字符为基础,依次获取后面的num个元素组成的子串
for i in range(len(stra)-num+1):
temp = stra[i:i+num]
# print(temp)
# AC CG GT
cnt = 0
# 对每个temp子串进行判断是否存C或G字符,如存在则计数+1
for j in temp:
if j == 'C' or j == 'G':
cnt += 1
# 每个temp子串,算出的子串cnt个数,除以整个输入字符长度,则为子串CG占比
rat = cnt / len(temp)
# 将子串和长度写入,也可写入三个值【子串,占比,索引i,后面排序拿到最大rat后再剔除后排序最小索引】
# 元组值三个情况,索引还是得循环删除不符合要求元素,效率差不多
res.append((temp,rat))
# print(res)
# [('AC', 0.5), ('CG', 1.0), ('GT', 0.5)]
big = sorted(res,reverse=True,key=lambda x:x[1])[0][1]
# 此处对所有符合要求的子串进行倒序,按元组第二个元素排序,取第一个最大值
# [('CG', 1.0), ('AC', 0.5), ('GT', 0.5)] 1.0
# print(big)
# 顺序查找,找到第一个后则返回即可
for i in res:
if i[1] == big:
# print(i[0])
return i[0]
#else:
# print('okk',i[0],i[1])
stra = input().strip()
num = int(input().strip())
res = exam(stra,num)
print(res)