【JavaScript】配列内のすべての単語をメッシュ化して、つなぎの文字を取得する方法
問題
2つの単語は、最初の単語の末尾の部分文字列が次の単語の先頭の部分文字列と一致するとき、「メッシュ(連結)」できると言えます。たとえば、「robinhood」と「hoodie」は「hood」という部分でつながるため、メッシュ化が可能です。
この記事では、文字列の配列を受け取るJavaScript関数を作成します。配列内のすべての単語が順番にメッシュ化できる場合は、つなぎとなる共通部分を連結した文字列を返し、1組でもつながらないペアがあれば空文字列を返すようにします。
アルゴリズムの考え方
隣接する2つの単語をスペースで連結した文字列に対し、後方参照を使った正規表現 /(.+) \1/ を適用すると、「同じ部分文字列が繰り返し現れる箇所」、つまり前の単語の末尾と次の単語の先頭が一致する部分を検出できます。どのペアでもマッチしなかった場合は、その時点で空文字列を返します。
サンプルコード
以下が実際のコードです −
const arr = ["allow", "lowering", "ringmaster", "terror"];
const meshArray = (arr = []) => {
let res = "";
for(let i = 0; i < arr.length-1; i++){
let temp = (arr[i] + " " + arr[i + 1]).match(/(.+) \1/);
if(!temp){
return '';
};
res += temp[1];
};
return res;
};
console.log(meshArray(arr));
出力結果
コンソールへの出力は以下のとおりです −
lowringter
コードの解説
この例では、「allow」と「lowering」が「low」、「lowering」と「ringmaster」が「ring」、「ringmaster」と「terror」が「ter」で、それぞれ隣り合う単語同士がつながっています。したがって、これらの共通部分を順に連結した「lowringter」が出力されます。
一方、配列の中に1組でも重なりを持たない隣接ペアが存在すれば、ループ内で即座に空文字列 '' が返されるため、すべての単語がメッシュ化できるかどうかを簡単に判定できます。
-
【JavaScript】配列内のすべての単語をメッシュ化して、つなぎの文字を取得する方法
問題 2つの単語は、最初の単語の末尾の部分文字列が次の単語の先頭の部分文字列と一致するとき、「メッシュ(連結)」できると言えます。たとえば、「robinhood」と「hoodie」は「hood」という部分でつながるため、メッシュ化が可能です。 この記事では、文字列の配列を受け取るJavaScript関数を作成します。配列内のすべての単語が順番にメッシュ化できる場合は、つなぎとなる共通部分を連結した文字列を返し、1組でもつながらないペアがあれば空文字列を返すようにします。 アルゴリズムの考え方 隣接する2つの単語をスペースで連結した文字列に対し、後方参照を使った正規表現 /(.+) \1/ を
-
JavaScriptで配列の要素をすべて奇数に変換する方法
問題 配列を受け取り、その各要素を次のルールに従って変換するJavaScript関数を作成することを考えます。 数値が奇数の場合 → そのままの値を保持する 数値が偶数の場合 → 1を引いて奇数に変換する そして最後に、変換後の新しい配列を返します。 コード例 以下が実際のコードです。 const arr = [5, 23, 6, 3, 66, 12, 8]; const reduceToOdd = (arr = []) => { const res = []; for(let i =