2016-11-02 5 views
0

繰り返し3文字を含まない連続した数字の最長文字列の長さを探しています。可能な限り長い文字列の長さには繰り返し3文字が含まれていません

これはバイオインフォマティクスに関する質問です。タンパク質配列についてこれを分類しています。

010が基本的には0102340109のように動作しません。

しかし、繰り返し3桁が見つからないため、0002223589765のようなものが動作します。

私は最も長いシーケンスを見つける必要があります。私はちょっと固まっていて、無知です。

+1

実際のアプリケーションには9つの異なる数字がありますか、それともかなり異なるのですか?間にある文字列が3桁の長さの倍数ではないにもかかわらず、 '701080109'は繰り返し '010'を含んでいますか?繰り返しの重複はどうですか? 「01010」は重複しているにもかかわらず2回出現するので違法となるか? – MvG

+2

私はこれが参考になると思うhttps://en.wikipedia.org/wiki/De_Bruijn_sequence – Bill

+0

ありがとうございました!私は実際にそのブリュージーンのシーケンスについては決して考えなかった – JY078

答えて

0

以下のコードは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)を使用します。

関連する問題