首页 > 试题广场 >

DNA序列

[编程题]DNA序列
  • 热度指数:133892 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

一个 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 等等

数据范围:字符串长度满足  ,输入的字符串只包含 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。    
else多考虑一个输入长度=总长,用例全部通过
"""
真分数:y/x<(y+1)/(x+1)
dp[i][j]:S[i]~S[j]构成子列的GC个数
"""
while True:
    try:
        S=input()
        N=int(input())
        n=len(S)
        dp=[[0]*n for _ in range(n)]
        max_ration=0
        # 初始化
        for i in range(n):
            if S[i] in 'CG':
                dp[i][i]=1  
            
        for i in range(n):
            for j in range(i+1,n,1):
                if S[j] in 'GC':
                    dp[i][j]=dp[i][j-1]+1
                if S[j] not in 'GC':
                    dp[i][j]=dp[i][j-1]
        for j in range(1,n,1):
            for i in range(0,j,1):
                if S[i] in 'GC':
                    dp[i][j]=dp[i+1][j]+1
                if S[i] not in 'GC':
                    dp[i][j]=dp[i+1][j]
        
        if n>N:
            for i in range(n-N):
                j=i+N-1
                tmp=dp[i][j]
                if tmp>max_ration:
                    max_ration=tmp
            for i in range(n-N):
                j=i+N-1
                if dp[i][j]==max_ration:
                    print(S[i:j+1])   
                    break    
        else:
            print(S)
    except:
        break

发表于 2023-02-07 23:52:29 回复(0)
s = input() 
n = int(input())
res = list() 

for i in range(len(s)-n+1):
    res.append(s[i:i+n])

res.sort(key=lambda x:(x.count('C')+x.count('G'))/n,reverse=True) 

print(res[0])

发表于 2022-12-17 21:20:59 回复(0)
n = input()
length = int(input())
l = []
l2 = []
dic = {}
for i in range((len(n)-length+1)):
    cut = n[i:length+i]
    l.append(cut)
for j in l:
    num = (j.count('C') + j.count('G'))/length
    l2.append(num)
for index, value in enumerate(l):
    dic[value] = l2[index]
res = sorted(dic.items(), key=lambda x: x[1], reverse=True)
print(res[0][0])

发表于 2022-09-15 11:09:49 回复(0)
a=input()
n=int(input())
if len(a)>n:
    l=[]
    for i in range(len(a)-n):
        if 'C' in a[i:i+n] or 'G' in a[i:i+n]:
            l.append(a[i:i+n])
    for j in range(1,len(l)):
        x=l[1].count('C')+l[1].count('G')
        y=l[0].count('C')+l[0].count('G')
        if x>y:
            l.pop(0)
        else:
            l.pop(1)
    for k in l:
        print(k)
else:
    print(a)
发表于 2022-09-03 00:51:15 回复(0)
a = input()
k = int(input())
n = len(a)
ratio = 0
result = ""
for i in range(0,n-k+1):
    temp = a[i:i+k]
    new_ratio = (temp.count("G") + temp.count("C"))/k
    if new_ratio > ratio:
        ratio = new_ratio
        result = temp
print(result)

发表于 2022-08-27 20:57:35 回复(0)
挺复杂的写法,运行应该很慢的,不过这边对时间的要求好像不是很高,对我这种小菜鸡还是友好的
s = input()
length = int(input())
li = [] # 存放所有长度为length的子串
for i in range(len(s)):
    for j in range(i, len(s)):
        if len(s[i: j+1]) == length:
            li.append(s[i: j+1])
# print(li)
dic = {} # 存放子串及其GC值在字典中
for j in li:
    dic[j] = (j.count('C') + j.count('G')) / len(j)
# print(dic)
for k, v in dic.items():
    if v == max(dic.values()):
        print(k)
        break

发表于 2022-08-22 20:35:21 回复(1)
# 窗口滑动问题
while True:
    try:
        DNA = input()
        num = int(input())
        i = 0
        max_CG = 0
        res = ''
        
        # 避免固定长度与给定字符串相同的情况,要加到最后一位
        while i <= len(DNA) - num:
            if DNA[i:i + num].count('C') + DNA[i:i + num].count('G') > max_CG:
                max_CG = DNA[i:i + num].count('C') + DNA[i:i + num].count('G')
                res = DNA[i: i + num]
                i += 1
            else:
                i += 1

        print(res)

    except:
        break

发表于 2022-08-19 17:01:53 回复(0)
n=input()
m=int(input())
dic={}
l=0
if len(n)==m:
    print(n)
else:
    for i in range(len(n)-m):
        a=n[i:i+m].count('C')
        b=n[i:i+m].count('G')
        dic[n[i:i+m]]=a+b
        if a+b>l:
            l=a+b
    for i in dic:
        if dic[i]==l:
            print(i)
            break

发表于 2022-08-13 10:11:00 回复(0)
dna = input()
length = int(input())

if length >= len(dna):
    print(dna)
else:
    sub_strs = []
    for index in range(len(dna)-length):
        sub_strs.append(dna[index:index+length])

    GC_ratio = []
    for sub_str in sub_strs:
        GC_ratio.append((sub_str.count("C") + sub_str.count("G"))/length)

    highest_GC_ratio_index = GC_ratio.index(max(GC_ratio))
    print(sub_strs[highest_GC_ratio_index])

发表于 2022-08-09 21:00:13 回复(0)
while True:
    try:
        DNA=input()
        n=int(input())
        Max=0
        dp=[]
        if len(DNA)==n:
            print(DNA)
            break
        for i in range(0,len(DNA)-n):
            c_count=DNA[i:i+n].count("C")
            G_count=DNA[i:i+n].count("G")
            if (c_count+G_count)>Max:
                Max=(c_count+G_count)
                dp.append(DNA[i:i+n])
        for i in dp:
            if (i.count("C")+i.count("G"))==Max:
                print(i)
                break
    except:
        break

发表于 2022-07-19 23:20:17 回复(0)
简单
s = input()
n = int(input())
res = []
for i in range(len(s)-n+1):
    j1 = s[i:i+n]
    j2 = j1.count('C')
    j3 = j1.count('G')
    j4 = (j2+j3)/len(j1)
    res.append((j1,j4))
res2 = sorted(res,key=lambda x:x[1],reverse=True)
result = res2[0][0]
print(result)

发表于 2022-06-29 22:02:11 回复(0)
def func():
    sk=list(input())
    n=int(input())
    length=len(sk)
    rt=[]
    for i in range(length):
        re=sk[i:i+n]
        if len(re)==n:
            #print(re)
            rt.append(re)
    #print(rt)
    result=0
    fin=[]
    for j in rt:
        tmp=0
        for w in j:
            if w=="C" or w=="G":
                tmp+=1
        fin.append([j,rt.index(j),tmp])
    #print(fin)
    fin.sort(key=lambda x:[x[2],-x[1]],reverse=True)#先逆序,再正序,用-号
    #多层排序,lambda后面没有逗号,字段用[]引起,并加逗号
    #print(fin)
    result=fin[0][0]
    print("".join(result))
        
            
            
            
func()
发表于 2022-06-12 12:22:41 回复(0)
while True:
    try:
        strs = input()
        l = int(input())
        a = []
        k = 0     #比例系数
        for i in range(len(strs)):     
            a.append(strs[i:i+l])    #所有子串依次放入列表
            if k < (strs[i:i+l].count("C") + strs[i:i+l].count("G")): #判断每个子串中的CG个数
                k = strs[i:i+l].count("C") + strs[i:i+l].count("G")   #保留最大个数
        for i in a:
            if (i.count("C")+i.count("G")) == k:    #二次遍历,第一次出现最大个数,立即输出该子串
                print(i)
                break    #仅输出一次       
    except:
        break

发表于 2022-06-10 14:23:07 回复(0)
str1 = input()
N=int(input())

maxGC = 0
need = ''
for i in range(len(str1)):
    if i+N <=len(str1):
        cut = str1[i:i+N]
        GC = (cut.count('G')+cut.count('C'))/N
        if GC>maxGC:
            maxGC = GC
            need = cut
    
print(need)
发表于 2022-05-31 15:56:43 回复(0)
import sys
list1 = sys.stdin.readlines()
list2 = []
for item in list1:
    list2.append(item.strip('\n').replace(' ',''))
list3 = []
for i in range(0,len(list2[0])-int(list2[1])+1):
    if 'C'in list2[0][i:i+int(list2[1])] or 'G' in list2[0][i:i+int(list2[1])]:
            list3.append(list2[0][i:i+int(list2[1])])
high_num = 0
GC_STR = ''
for item in list3:
    if high_num < float((item.count('C')+item.count('G'))/len(item)):
        high_num = float((item.count('C')+item.count('G'))/len(item))
        GC_STR = item
print(GC_STR)
发表于 2022-05-18 17:17:05 回复(0)
str1 = input()
num = int(input())
s = []
m = []
for i in range(len(str1)):
    k = str1[i:i+num]
    s.append(k)
for j in s:
    num1= j.count('C') + j.count('G')
    m += [num1]
# print(m)
m1 = sorted(m)
for n in range(len(m)):
    if m1[-1] == m[n]:
        # print(n)
        print(s[n])
        break
发表于 2022-05-16 10:38:47 回复(0)
while True:
    try:
        DNA = input()
        n = int(input())
        max_per = 0
        for i in range(len(DNA)-n+1):
            a = DNA[i:i+n]
            new_per = (a.count('C') + a.count('G')) / n
            if new_per > max_per:
                max_per = new_per
        for i in range(len(DNA)-n+1):
            if (DNA[i:i+n].count('C') + DNA[i:i+n].count('G')) / n == max_per:
                print(DNA[i:i+n])
                break
    except:
        break

发表于 2022-05-11 12:02:15 回复(0)
dna=input()
n = int(input())
index=[]
for i in range((len(dna)-n+1)):
    index.append(dna[i:i+n])
num=[]
count=0
for i in index:
    for j in i:
        if j == 'C' or j == 'G':
            count+=1
    num.append(count)
    count=0
print(index[num.index(max(num))])
发表于 2022-05-06 20:49:54 回复(0)
while True:
    try:
        a = input('')
        N = int(input(''))
        res = ''
        num = 0 # 记录先遇到的GC含量最大的子串长度
        for i in range(len(a)-N+1):
            if a[i:i+N].count('C')+a[i:i+N].count('G') > num:
                num = a[i:i+N].count('C')+a[i:i+N].count('G')
                res = a[i:i+N]
        print(res)
    except:
        break
发表于 2022-05-04 17:20:54 回复(0)