JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】プログレッシブ配列(1文字ずつ成長する文字列の並び)を判定する方法

問題概要

長さの昇順に並べられた文字列の配列を受け取るJavaScript関数を作成します。この関数は、隣接するすべての文字列ペアについて、後ろの文字列が前の文字列の先頭または末尾に1文字を追加して作れるものである場合に true を返し、1つでも条件を満たさないペアが存在すれば false を返します。

たとえば、次の配列が与えられたとしましょう。

const arr = ["c", "ca", "can", "acan", "acane", "dacane"];

この配列では、「ca」は「c」の末尾に「a」を加えた文字列、「can」は「ca」の末尾に「n」を加えた文字列、といった具合に、どの隣接ペアも条件を満たしています。そのため、関数は true を返す必要があります。

コード例

const arr = ["c", "ca", "can", "acan", "acane", "dacane"];
const isProgressive = arr => {
    for(let i = 0; i < arr.length - 1; i++){
        const nextLength = arr[i+1].length;
        if(arr[i+1] === arr[i+1][0] + arr[i] ||
           arr[i+1] === arr[i] + arr[i+1][nextLength-1]){
            continue;
        }
        return false;
    }
    return true;
};
console.log(isProgressive(arr));

出力結果

コンソールには次のように表示されます。

true

ロジックの解説

この関数の処理の流れは以下の通りです。

  • for ループで配列を先頭から順に走査し、隣接する2つの文字列(arr[i] と arr[i+1])を比較します。
  • 後ろの文字列の先頭に1文字付けると前の文字列と一致するか(arr[i+1][0] + arr[i])、あるいは末尾に1文字付けると一致するか(arr[i] + 最後の1文字)を判定します。
  • どちらかの条件を満たせば continue で次のペアへ進み、どちらも満たさなければ即座に false を返します。
  • すべてのペアが条件を満たしていれば、ループを抜けて true を返します。

より簡潔な別解:slice() と every() を使う方法

slice() を使えば「後ろの文字列から先頭(または末尾)の1文字を取り除いたものが前の文字列と一致するか」という形で判定でき、コードがさらに読みやすくなります。

const isProgressive = arr =>
  arr.every((str, i) => {
    if (i === 0) return true; // 最初の要素は比較対象がない
    const prev = arr[i - 1];
    // 先頭の1文字を除いたもの、または末尾の1文字を除いたものが
    // 前の文字列と一致すればよい
    return str.slice(1) === prev || str.slice(0, -1) === prev;
  });

console.log(isProgressive(["c", "ca", "can", "acan", "acane", "dacane"])); // true

Array.prototype.every() は配列内のすべての要素が条件を満たす場合にのみ true を返すため、「途中で不一致が見つかった時点で false を返す」という要件に自然に対応できます。また、配列の要素が0個または1個の場合も true となり、エッジケースも安全に処理されます。

  1. JavaScriptのArray.prototype.map()メソッドの使い方を徹底解説

    Array.prototype.map()とは? JavaScriptのArray.prototype.map()メソッドは、配列の各要素に対してコールバック関数を実行し、その戻り値から新しい配列を作成するためのメソッドです。元の配列は変更されないため、安全にデータ変換を行いたい場合に非常に便利です。 構文 arr.map(function callback(currentValue[, index[, array]]) 各引数の意味は以下のとおりです。 currentValue:現在処理している要素の値 index(省略可能):現在処理している要素のインデックス番号 array(省略可能

  2. JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介

    JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の