Задача:
Дана непустая нуль-индексированная строка S. Строка S состоит из N символов из набора английских букв верхнего регистра A, C, G, T.
Эта строка фактически представляет собой последовательность ДНК, а буквы верхнего регистра представляют собой одиночные нуклеотиды.
Вам также предоставляются непустые нуль-индексированные массивы P и Q, состоящие из M целых чисел. Эти массивы представляют собой запросы о минимальных нуклеотидах. Мы представляем буквы строки S целыми числами 1, 2, 3, 4 в массивах P и Q, где A = 1, C = 2, G = 3, T = 4, и предположим, что A < C < G < Т.
Запрос K требует от вас найти минимальный нуклеотид из диапазона (P [K], Q [K]), 0 ≤ P [i] ≤ Q [i] Н.
Например, рассмотрим строку S = GACACCATA и массивы P, Q такие, что:
P[0] = 0 Q[0] = 8
P[1] = 0 Q[1] = 2
P[2] = 4 Q[2] = 5
P[3] = 7 Q[3] = 7
Минимальные нуклеотиды из этих диапазонов следующие:
(0, 8) is A identified by 1,
(0, 2) is A identified by 1,
(4, 5) is C identified by 2,
(7, 7) is T identified by 4.
Напишите функцию:
class Solution { public int[] solution(String S, int[] P, int[] Q); }
что, учитывая непустую нуль-индексированную строку S, состоящую из N символов и двух непустых нуль-индексированных массивов P и Q, состоящих из M целых чисел, возвращает массив, состоящий из символов M, указывающих последовательные ответы на все запросы.
Последовательность должна быть возвращена как:
a Results structure (in C), or
a vector of integers (in C++), or
a Results record (in Pascal), or
an array of integers (in any other programming language).
Например, для строки S = GACACCATA и массивов P, Q таких, что:
P[0] = 0 Q[0] = 8
P[1] = 0 Q[1] = 2
P[2] = 4 Q[2] = 5
P[3] = 7 Q[3] = 7
функция должна возвращать значения [1, 1, 2, 4], как объяснялось выше.
Предположим, что:
N is an integer within the range [1..100,000];
M is an integer within the range [1..50,000];
each element of array P, Q is an integer within the range [0..N − 1];
P[i] ≤ Q[i];
string S consists only of upper-case English letters A, C, G, T.
Сложность:
expected worst-case time complexity is O(N+M);
expected worst-case space complexity is O(N),
beyond input storage
(not counting the storage required for input arguments).
Элементы входных массивов могут быть изменены.
Мое решение:
class Solution {
public int[] solution(String S, int[] P, int[] Q) {
final char c[] = S.toCharArray();
final int answer[] = new int[P.length];
int tempAnswer;
char tempC;
for (int iii = 0; iii < P.length; iii++) {
tempAnswer = 4;
for (int zzz = P[iii]; zzz <= Q[iii]; zzz++) {
tempC = c[zzz];
if (tempC == 'A') {
tempAnswer = 1;
break;
} else if (tempC == 'C') {
if (tempAnswer > 2) {
tempAnswer = 2;
}
} else if (tempC == 'G') {
if (tempAnswer > 3) {
tempAnswer = 3;
}
}
}
answer[iii] = tempAnswer;
}
return answer;
}
}
Это не оптимально, я считаю, что это должно быть сделано в течение одного цикла, любой намек, как я могу его достичь?
Вы можете проверить качество своего решения здесь https://codility.com/train/ имя теста - это запрос Genomic-range.