2017-11-13 16 views
0

2つの配列が0から9の間の乱数で初期化されています
私はそれらの両方に存在する最も長い配列を見つける必要があります。例えば2つの配列の中で最も長い配列番号

var arrFirst = [8,5,3,0,3,1,8,2,8,7,3,5,4,0,8,5,7,3,1] 
var arrSecond = [8,5,4,0,2,9,4,3,6,9,2,3,1,8,2,8,7,3,3] 

結果の配列は、我々は[5、8]を右スタートでシーケンスを持っていますが、それはです。この例では、両方の配列

var arrResult = [3,1,8,2,8,7,3] 

に表示される最長の手順を含む必要最長のものではありません。

私に役立つコードを教えてください。

ありがとう

+0

質問は何ですか?コードをリクエストしていますか? – evolutionxbox

+0

「最長同一シーケンス」とはどういう意味ですか? – Mamun

+1

試したときに何が問題になりましたか? – Teemu

答えて

0

二番目の配列には存在しますが、array2のすべての要素をarray1のECH要素をチェックして、whileで要素をチェックしに行くことができる最大の長さを検索するには、このように使用しますループをカウンタで、各配列に対してインデックスのオフセットを設定します。

見つかった同じ要素の長さが最後に検出された配列より大きいか等しいかどうかを確認し、結果セットを新しい長いものに置き換えるか、結果セットと等しい場合は追加します。

var array1 = [8, 5, 3, 0, 3, 1, 8, 2, 8, 7, 3, 5, 4, 0, 8, 5, 7, 3, 1], 
 
    array2 = [1, 8, 4, 0, 2, 9, 4, 3, 6, 9, 2, 3, 1, 8, 2, 8, 7, 3, 3], 
 
    result = array1.reduce(function (r, _, i, a) { 
 
     array2.forEach(function (__, j, b) { 
 
      var k = 0, 
 
       temp = []; 
 

 
      while ((i + k) in a && (j + k) in b && a[i + k] === b[j + k]) { 
 
       temp.push(a[i + k]); 
 
       k++; 
 
      } 
 
      if (!r.length || temp.length > r[0].length) { 
 
       r = [temp]; 
 
       return; 
 
      } 
 
      if (temp.length === r[0].length) { 
 
       r.push(temp); 
 
      } 
 
     }); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

のarr1 = [8,5,3]および 'arr2 = [1、8、3]'のために下向きに投票してください – vivek

+0

@vivek、nice catch、私はチェックのための既存のインデックスのみを取るいくつかのチェックを追加しました。 –

+0

すべての組み合わせを見つけられないのはなぜですか? – vivek

1

擬似コード:

1)create two more arrays for longest sequence and another one for running sequence 
2)Start looking for matches between 2 original arrays 
3)Keep current sequence in runningSequence array 
4)check if arrays match 
    5)if so check if length of running sequence is longer than theLongestSequence array 
    6)If so, replace the longestSequenceArray content with runningSequence array and keep going 
    7)if not, proceed to next char position 
8)Repeat until all chars in original arrays are processed by going back to step 4 
9)Print Longest array content 

上記のロジックをコードに書き込むために、あなたの責任です。

Good Luck。

0

var arrFirst = [8,5,3,0,3,1,8,2,8,7,3,5,4,0,8,5,7,3,1]; 
 
var arrSecond = [8,5,4,0,2,9,4,3,6,9,2,3,1,8,2,8,7,3,3]; 
 
var firstStr = arrFirst.join(""); 
 
var secondStr = arrSecond.join(""); 
 
var combinations = getCombination(firstStr); 
 
combinations = combinations.sort(function(a, b){ 
 
    return b.length - a.length; 
 
}); 
 
for(var i in combinations){ 
 
    if(secondStr.indexOf(combinations[i]) !== -1){ 
 
    console.log(combinations[i]+" found with length : "+combinations[i].length); 
 
    console.log(combinations[i].split("")); 
 
    break; 
 
    } 
 
} 
 

 
function getCombination(str) { 
 
    var fn = function(active, rest, a) { 
 
     if (!active && !rest) 
 
      return; 
 
     if (!rest) { 
 
      if(firstStr.search(active) !== -1){ 
 
       a.push(active); 
 
      } 
 
     } else { 
 
      fn(active + rest[0], rest.slice(1), a); 
 
      fn(active, rest.slice(1), a); 
 
     } 
 
     return a; 
 
    } 
 
    return fn("", str, []); 
 
}

関連する問題