人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染。(注意,人的DNA序列是线性的,而病毒的DNA序列是环状的)
输入第一行中给出1个整数i(1≤i≤11),表示待检测的病毒DNA和患者DNA的对数。
输入i行串序列,每行由两个字符串组成(字符串中不含不可见字符),两字符串之间用一个空格分隔,分别代表病毒的DNA序列和患者的DNA序列,病毒的DNA序列和患者的DNA序列长度不超过500。
依次逐行输出每对检测样本的结果,感染输出:YES,未感染输出:NO。
1
baa bbaabbba
YES
2
cced cdccdcce
bcd aabccdxdxbxa
YES
NO
s
)中是否存在病毒序列(t
)。它通过同时遍历两个序列,当字符匹配时,两个指针都向前移动。如果不匹配,则将DNA序列的指针向前移动,并将病毒序列的指针重置为0。如果在遍历完整个DNA序列后,病毒序列也完全遍历了,那么就返回True,表示DNA中存在该病毒。index
函数来实现。如果在所有转换后的版本中都没有找到匹配的子序列,那么就返回False,表示DNA中不存在该病毒。test
函数的返回结果输出"YES"或"NO"。Python版本:
def index(s, t):
i, j = 0, 0
while i < len(s) and j < len(t):
if s[i] == t[j]:
i += 1
j += 1
else:
i = i - j + 1
j = 0
if j >= len(t):
return True
else:
return False
def trans(t):
a = t
b = a[0]
t = a[1:] + b
return t
def test(s, t):
for i in range(len(t)):
if i != 0:
t = trans(t)
if index(s, t):
return True
return False
n = int(input())
for _ in range(n):
virus, DNA = input().split()
if test(DNA, virus):
print("YES")
else:
print("NO")
这个算法的思路是利用滑动窗口和字符匹配来找出是否存在特定的病毒序列。通过转换病毒序列并多次检查其所有可能版本,可以更全面地检查DNA序列。