#2
rjsp2023-10-11 15:15
|
程序代码:
/*
给定长度为 n 且只含有 A、T、C、G和?的字符串s,其中?可以转换为任何一个字母。
问是否存在一个字符串,使得将所有的?替换成字母后,A、T、C、G个数相等。
输入两行
第一行,一个整数n(4<=n<=255),表示字符串的长度
第二行,一个字符串s
输出一行
表示将所有的?替换成字母后使得A、T、C、G个数相等的字符串,
若不存在输出“===”(不含引号)。
Examples
input1
8
AG?C??CT
output1
AGACGTCT
input2
6
????G?
output2
===
input3
4
AA??
output3
===
*/
#include<iostream>
using namespace std;
int main(){
char x[256];
int a[4]={0};
char g[4]={'A','C','G','T'};
int i,k,c,d=0,flag=0,e=0;
scanf("%d",&k);
if((k%4)!=0){//长度不是4的倍数直接===
printf("===");
return 0;
}
x[k]='\0';
for(i=0;i<k;i++){
scanf(" %c",&x[i]);
if(x[i]=='?') e++;//统计?出现次数
switch(x[i]){//统计各字母出现次数
case 'A':a[0]++; break;
case 'C':a[1]++; break;
case 'G':a[2]++; break;
case 'T':a[3]++; break;
}
}
if(e==0) goto print;//如果没有?直接输出原字符串
c=k/4;//每个字母应该有的数量
for(i=0;i<4;i++){
if(a[i]>c) {//如果有字母的数量超过了它应该有的数量直接===
printf("===");
return 0;
}
else a[i]-=c;//计算每个字母还要出现几次
}
for(i=0;i<k;i++){
if(x[i]=='?'){
while(flag==0){
if(a[d]>0){//一旦出现?,检查每个字母还要替代多少次
x[i]=g[d];
a[d]--;
}
else d++;//如果一个字母出全了,再换下一个字母
if(x[i]!='?')flag=1;//一旦成功替换,结束while循环,再找下一个?
}
flag=0;//结束while循环后把flag初始化
}
}
print:for(i=0;i<k;i++){
printf("%c",x[i]);
}
return 0;
}
}