다음 코드는 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)
을 사용하여 하위 문자열을 가능성을 없애기 위해 사용합니다.
실제 응용 프로그램에 9 자리 숫자가 있습니까? 아니면 상당히 다른 실제 숫자입니까? '701080109'는 그 중간에있는 문자열이 3 자리수의 배수가 아니더라도 반복되는 '010'을 포함합니까? 겹치는 반복은 어때요? '01010'은 중복 되더라도 '010'이 두 번 나오므로 불법입니까? – MvG
이것이 참고 자료라고 생각합니다. https://en.wikipedia.org/wiki/De_Bruijn_sequence – Bill
정말 고마워요! 나는 그 드 브루 지인 시퀀스에 대해 결코 생각하지 않았다. – JY078