【发布时间】:2016-10-01 11:39:45
【问题描述】:
我有一个长度为n 的字符串,由字母A、G、C 和T 组成。如果字符串包含相等数量的A、G、C 和T(每个n/4 次),则该字符串是稳定的。我需要找到替换后使其稳定的子字符串的最小长度。这是问题的完整描述link。
假设s1=AAGAAGAA。
现在由于n=8,理想情况下它应该有2个As、2个Ts、2个Gs和2个Cs。它有 4 个过多的As。因此我们需要一个至少包含 4 个As 的子字符串。
我首先从左侧获取一个 4 个字符的子字符串,如果没有找到,则增加一个变量 mnum(即查找 5 个变量子字符串,依此类推)。
我们得到AAGAA 作为答案。 但是太慢了。
from collections import Counter
import sys
n=int(input()) #length of string
s1=input()
s=Counter(s1)
le=int(n/4) #ideal length of each element
comp={'A':le,'G':le,'C':le,'T':le} #dictionary containing equal number of all elements
s.subtract(comp) #Finding by how much each element ('A','G'...) is in excess or loss
a=[]
b=[]
for x in s.values(): #storing frequency(s.values--[4,2]) of elements which are in excess
if(x>0):
a.append(x)
for x in s.keys(): #storing corresponding elements(s.keys--['A','G'])
if(s[x]>0):
b.append(x)
mnum=sum(a) #minimum substring length to start with
if(mnum==0):
print(0)
sys.exit
flag=0
while(mnum<=n): #(when length 4 substring with all the A's and G's is not found increasing to 5 and so on)
for i in range(n-mnum+1): #Finding substrings with length mnum in s1
for j in range(len(a)): #Checking if all of excess elements are present
if(s1[i:i+mnum].count(b[j])==a[j]):
flag=1
else:
flag=0
if(flag==1):
print(mnum)
sys.exit()
mnum+=1
【问题讨论】:
标签: python python-3.x string algorithm optimization