以下のコードはES6で書かれています。あなたはこれを使用して、あなたはスライド式の窓を通してその繰り返し処理seqIsRepeated
手順を定義することができ、その後
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' ]
文字列入力aを取る
sliding
手順は、サブストリング「窓」の反復処理可能を返すことができます。ウィンドウのリスト全体を事前に計算するのではなく、各結果を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つの異なる数字がありますか、それともかなり異なるのですか?間にある文字列が3桁の長さの倍数ではないにもかかわらず、 '701080109'は繰り返し '010'を含んでいますか?繰り返しの重複はどうですか? 「01010」は重複しているにもかかわらず2回出現するので違法となるか? – MvG
私はこれが参考になると思うhttps://en.wikipedia.org/wiki/De_Bruijn_sequence – Bill
ありがとうございました!私は実際にそのブリュージーンのシーケンスについては決して考えなかった – JY078