2016-11-02 18 views
0

반복되는 3-mer가없는 가장 긴 연속 문자열의 길이를 찾으려고합니다.가능한 가장 긴 문자열의 길이는 반복되는 3-mer를 포함하지 않습니다.

이것은 생물 정보학 질문이며 단백질 서열에 대해 이것을 분류하고 있습니다.

기본적으로 가 반복되므로 0102340109과 같은 문자가 작동하지 않습니다.

반복되는 3 자리를 찾을 수 없기 때문에 0002223589765과 같은 문자가 작동합니다.

나는 가장 긴 순서를 찾아야하고 나는 좀 붙어있어 우둔 해.

+1

실제 응용 프로그램에 9 자리 숫자가 있습니까? 아니면 상당히 다른 실제 숫자입니까? '701080109'는 그 중간에있는 문자열이 3 자리수의 배수가 아니더라도 반복되는 '010'을 포함합니까? 겹치는 반복은 어때요? '01010'은 중복 되더라도 '010'이 두 번 나오므로 불법입니까? – MvG

+2

이것이 참고 자료라고 생각합니다. https://en.wikipedia.org/wiki/De_Bruijn_sequence – Bill

+0

정말 고마워요! 나는 그 드 브루 지인 시퀀스에 대해 결코 생각하지 않았다. – JY078

답변

0

다음 코드는 ES6에 기록됩니다. 당신은 문자열 입력 a를 취하는 sliding 절차는이를 사용하여 그런 다음 "창"

Array.from(sliding (3,1) ('')) 
// [ '012', '123', '234', '345' ] 

Array.from(sliding (2,2) ('')) 
// [ '01', '23', '45' ] 

Array.from(sliding (4,2) ('')) 
// [ '0123', '1234', '2345' ] 

, 문자열의의 Iterable를 반환 할 수 있습니다, 당신은 seqIsRepeated 절차를 정의 할 수 있습니다 슬라이딩 창을 통해 어느 반복합니다. 전체 창 목록을 미리 계산하는 대신, 각 결과를 집합에 추가하여 1을 1로 살펴볼 것입니다. 윈도우가 이미 세트에 존재하면 즉시 true이 리턴되고 반복이 중지됩니다. 프로 시저가 중복을 찾지 않고 모든 창을 통해 수행하면 false이 리턴됩니다.

const sliding = (m,n) => function* (xs) { 
 
    for (let i = 0; i + m <= xs.length; i += n) 
 
    yield xs.substr(i, m); 
 
}; 
 

 
const seqIsRepeated = n => xs => { 
 
    let set = new Set(); 
 
    for (let seq of sliding (n,1) (xs)) 
 
    if (set.has(seq)) 
 
     return true; 
 
    else 
 
     set.add(seq); 
 
    return false; 
 
}; 
 

 
console.log (seqIsRepeated (3) ('0102340109')); // true 
 
console.log (seqIsRepeated (3) ('0002223589765')); // false

이 당신에게 순서를 찾을 수없는, 그러나 희망이 당신에게 시작을 준다

. 여기에서 입력 시퀀스의 부분 문자열을보고 seqIsRepeated(3)을 사용하여 하위 문자열을 가능성을 없애기 위해 사용합니다.