Who's Studio.

hihoCoder#1052 - 基因工程

Word count: 342Reading time: 1 min
2016/05/13

题目

对一个长度为N的字符串,修改若干个字符使得其最前K个字符与最后K个完全一致。问最少修改数。
具体描述请见hihoCoder

解题思路

仔细思考,最简单的情况是最前K个与最后K个没有重合,那么就是s[i] = s[N-K+i] 其中1<=i<=K;如果重合的话则是每隔N - K个都必须相等,即s[i] = s[i+(N-K)] 其中1<=i<=K,式子不变,但是要循环检查。注意遍历最前K个时只需要逐个检查到N-K就可以了,后面的已经被前面的覆盖了。

时间复杂度

时间复杂度为N。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int modify(string str, int K) {
int minC = 0;
int interval = str.size() - K;
for (int i = 0; i < interval; i++) {
int num = 0;
int A = 0, T = 0, C = 0, G = 0;
for (int j = i; j < str.size(); j += interval) {
num++;
if (str[j] == 'A')
A++;
else if (str[j] == 'T')
T++;
else if (str[j] == 'C')
C++;
else if (str[j] == 'G')
G++;
}
int maxC = max(max(A, T), max(C, G));
minC += num - maxC;
}

return minC;
}

int main() {
int T = 0;
cin >> T;
for (int i = 0; i < T; i++) {
string str;
cin >> str;
int K = 0;
cin >> K;

cout << modify(str, K) << endl;
}

return 0;
}
CATALOG
  1. 1. 题目
  2. 2. 解题思路
  3. 3. 时间复杂度
  4. 4. 代码