1 /// <summary>
2 /// Solution - Prefix Sums
3 /// 100/100
4 /// </summary>
5 /// <param name="S"></param>
6 /// <param name="P"></param>
7 /// <param name="Q"></param>
8 /// <returns></returns>
9 public static int[] solution(string S, int[] P, int[] Q)
10 {
11 int length = S.Length;
12 int[] result = new int[P.Length];
13 int[,] arr = new int[length, 4];
14
15 for (int i = 0; i < length; i++)
16 {
17 if (S[i] == 'A') arr[i, 0] = 1;
18 if (S[i] == 'C') arr[i, 1] = 1;
19 if (S[i] == 'G') arr[i, 2] = 1;
20 if (S[i] == 'T') arr[i, 3] = 1;
21 }
22
23 //compute prefixes
24 for (int i = 1; i < length; i++)
25 {
26 for (int j = 0; j < 4; j++)
27 {
28 arr[i, j] += arr[i - 1, j];
29 }
30 }
31
32 for (int i = 0; i < P.Length; i++)
33 {
34 int x = P[i];
35 int y = Q[i];
36 for (int j = 0; j < 4; j++)
37 {
38 int sub = 0;
39 if (x - 1 >= 0)
40 sub = arr[x - 1, j];
41 if (arr[y, j] - sub > 0)
42 {
43 result[i] = j + 1;
44 break;
45 }
46 }
47 }
48
49 return result;
50 }