您的位置:首页 > 产品设计 > UI/UE

Colidity--GenomicRangeQuery

2014-09-15 21:58 369 查看
思路:统计每一个字符前面的四个字符的个数(利用前缀和数组),这样就能在O(1)时间得到某个区间某个字符的个数

开始想到的是O(n^2)的空间,这个思路比较好

// you can use includes, for example:
// #include <algorithm>

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {
// write your code in C++11
int len = S.length();
vector<int> res;
vector<vector<int> > arr(len);

for(int k = 0 ; k < len ; ++k)
{
arr[k].resize(4);
}
int i,j;
for(i = 0; i < len; i++)
{
char c = S[i];
if(c == 'A') arr[i][0] = 1;
if(c == 'C') arr[i][1] = 1;
if(c == 'G') arr[i][2] = 1;
if(c == 'T') arr[i][3] = 1;
}
for(i = 1 ; i < len ; ++i)
{
for(j = 0 ; j < 4 ; ++j)
{
arr[i][j] += arr[i-1][j];
}
}
for(i = 0 ; i < P.size() ; ++i)
{
int x = P[i];
int y = Q[i];
for(j = 0 ; j < 4 ; ++j)
{
int sub = 0;
if(x-1>=0)
{
sub = arr[x-1][j];
}
if(arr[y][j] - sub > 0)
{
res.push_back(j+1);
break;
}
}
}
return res;
}


A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which correspond to the types of successive nucleotides in the sequence. Each nucleotide has an impact factor, which is an integer. Nucleotides of types A, C, G and T have impact factors of 1, 2, 3 and 4, respectively. You are going to answer several queries of the form: What is the minimal impact factor of nucleotides contained in a particular part of the given DNA sequence?

The DNA sequence is given as a non-empty string S =S[0]S[1]...S[N-1] consisting of N characters. There are M queries, which are given in non-empty arrays P and Q, each consisting of M integers. The K-th query (0 ≤ K < M) requires you to find the minimal impact factor of nucleotides contained in the DNA sequence between positions P[K] and Q[K] (inclusive).

For example, consider string S = CAGCCTA and arrays P, Q such that:

P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6

The answers to these M = 3 queries are as follows:



The part of the DNA between positions 2 and 4 contains nucleotides G and C (twice), whose impact factors are 3 and 2 respectively, so the answer is 2.

The part between positions 5 and 5 contains a single nucleotide T, whose impact factor is 4, so the answer is 4.

The part between positions 0 and 6 (the whole string) contains all nucleotides, in particular nucleotide Awhose impact factor is 1, so the answer is 1.


Write a function:


vector<int> solution(string &S, vector<int> &P, vector<int> &Q);


that, given a non-empty zero-indexed string S consisting of N characters and two non-empty zero-indexed arrays P and Q consisting of M integers, returns an array consisting of M integers specifying the consecutive answers to all queries.

The sequence should be returned as:



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).


For example, given the string S = CAGCCTA and arrays P, Q such that:

P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6

the function should return the values [2, 4, 1], as explained above.

Assume that:



N is an integer within the range [1..100,000];

M is an integer within the range [1..50,000];

each element of arrays P, Q is an integer within the range [0..N − 1];

P[K] ≤ Q[K], where 0 ≤ K < M;

string S consists only of upper-case English letters A, C, G, T.


Complexity:



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).

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: