Problem B: 信使核糖核酸转录后剪接
信使核糖核酸(mRNA)是由DNA单链转录而来。
DNA单链是由A、C、G、T四种核苷酸相接而成的长链。长链的两端是不同的,分别称为5’端和3’端。
mRNA也类似,不同的是,mRNA不含有T核苷酸,而是用U核苷酸代替。
一条DNA单链转录出来的mRNA是与其反向平行互补的。所谓反向平行,是指mRNA的5’端和3’端与DNA的两端正好相反。但习惯上都按5’到3’的顺序书写DNA和mRNA。
所谓互补,是指DNA与mRNA上的核苷酸必须以固定的方式两两配对。其配对方式如下:
DNA mRNA
A ---- U
C ---- G
G ---- C
T ---- A
对于真核生物来说,mRNA转录完成后,还要从中剪去一部份,剩下的部份再按原顺序连接起来,才是最终的产物。(当然也有可能不需要剪接)
现在给定一条DNA单链信息和最终的mRNA信息,请判断这条mRNA是否可能是由此DNA单链转录后剪接而成。
Input
多组测试数据。每组两行。
第一行是一个字符串,只含有A、C、G、T四个大写字母,0<长度<=1000000,表示一条DNA单链上的核苷酸,按5’到3’的方向顺序给出。
第二行是一个字符串,只含有A、C、G、U四个大写字母,0<长度<=1000000,表示一条最终mRNA上的核苷酸,按5’到3’的方向顺序给出。
Output
每组测试数据输出一行。如果这条mRNA可能是由这条DNA单链转录后剪接而来(或不需要剪接),则输出“YES”(不含引号);如果不可能,则输出“NO” (不含引号)。
Sample Input
AGTCGTATCTGCTGA
UCAAUGAC
TACAGCTGA
CACUG
CTAGCAGTTGTACTCATCA
AUGACAUGC
CATCTAGGCAGCT
AUCUGAUC
TCAG
AGUC
TCAG
CUGA
Sample Output
YES
YES
YES
NO
NO
YES
算法思路:先把DNA序列x[1..n]按位
转化为对应的mRNA上的核苷酸a[1..n],然后读入待分析的mRNA序列b[1..m],进行按位对比即可。
#include<stdio.h>
#include<string.h>
char a[1000005];
char b[1000005];
int main()
{
freopen("in","r",stdin);
while(scanf("%s",a)!=EOF){
int i,j,len_a,len_b;
char c;
len_a = strlen(a);
for(i=0;i<len_a;i++){
if(a[i] == 'A') a[i] = 'U';
else if(a[i] == 'C') a[i] = 'G';
else if(a[i] == 'G') a[i] = 'C';
else if(a[i] == 'T') a[i] = 'A';
}
scanf("%s",b);
len_b = strlen(b);
for(i=0,j=len_b-1;i<len_a;){
if(j==0) break;
if(a[i] == b[j]){
i++; j--;
}
else i++;
}
if(j==0) printf("YES\n");//如果j==0,说明b序列按序存在于a序列里
else printf("NO\n");
}
return 0;
}