hihocoder #1052 : 基因工程 字符串+找规律

版权声明:点个关注(^-^)V https://blog.csdn.net/weixin_41793113/article/details/89647805

题目链接:http://hihocoder.com/problemset/problem/1052?sid=1488001

描述

小Hi和小Ho正在进行一项基因工程实验。他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致。  

例如对于序列"ATCGATAC"和K=2,可以通过将第二个碱基修改为"C"使得最前面2个碱基与最后面两个碱基都为"AC"。当然还存在其他修改方法,例如将最后一个碱基改为"T",或者直接将最前面两个和最后面两个碱基都修改为"GG"。

小Hi和小Ho希望知道在所有方法中,修改碱基最少的方法需要修改多少个碱基。

输入

第一行包含一个整数T(1 <= T <= 10),代表测试数据的数量。

每组测试数据包含2行,第一行是一个由"ATCG"4个大写字母组成的长度为N(1 <= N <= 1000)的字符串。第二行是一个整数K(1 <= K <= N)。

输出

对于每组数据输出最少需要修改的碱基数量。

样例输入

2  
ATCGATAC  
2  
ATACGTCT
6 

样例输出

1  
3   

字符串操作题目,我自己是把情况分成了两种,如果输入的数字*2还小于等于字符串的长度,这种比较简单,从前往后比较即可,有多少个不同,result就加多少。

复杂的在后一种,比方说

ABCDAB    

4

这种比较是

ABCD

与CDAB比较

实际上就是字符串中的

0位与2位

1位与3位

2位与4位

3位与5位

比较。

之后的想法是把0 2 4 这样的分成一组,1 3 5这样的分成一组,因为这些的值都要相等,比如0 2 4位分别是A C A,只需把2中的C变为A就行,实际上就是在这个组中要想相等就要少数服从多数,所以对于每组来说,求出每组出线最多的元素的次数,总的元素数-最多的次数,意思就是让其他组员屈服,都等于我的值。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX = 1005;

int main(){
    string s;
    int k,T;
    cin>>T;
    while(T--){
        cin>>s>>k;
        int loop = s.size()-k;
        int ans=0;
        for(int i=0;i<loop;i++){
            int cnt[4];
            memset(cnt,0,sizeof(cnt));
            for(int j=i;j<s.size();j+=loop){//ATCG
                if(s[j]=='A') cnt[0]++;
                if(s[j]=='T') cnt[1]++;
                if(s[j]=='C') cnt[2]++;
                if(s[j]=='G') cnt[3]++;
            }
            int mmax = max(max(cnt[0],cnt[1]),max(cnt[2],cnt[3]));
            ans += cnt[0]+cnt[1]+cnt[2]+cnt[3]-mmax;
        }
        cout<<ans<<endl;
    }

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41793113/article/details/89647805