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

JavaScriptで配列内の部分文字列とスーパー文字列の組み合わせをすべて検索する方法

本記事では、文字列の配列を引数として受け取り、その配列内に存在するすべての「部分文字列」と「スーパー文字列(より長い側の文字列)」の組み合わせを検出し、該当する要素だけをまとめた配列を返すJavaScript関数の作成方法を解説します。

問題の概要

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

const arr = ["abc", "abcd", "abcde", "xyz"];

この場合、期待される出力は次のとおりです。

const output = ["abc", "abcd", "abcde"];

これは、「abc」と「abcd」がいずれも「abcde」の部分文字列となっているためです。一方、「xyz」は他のどの文字列とも部分文字列の関係にないため、結果には含まれません。

実装コード

この問題を解くコードは以下のとおりです。

const arr = ["abc", "abcd", "abcde", "xyz"];
const findStringCombinations = (arr = []) => {
    let i, j, res = {};
    for (i = 0; i < arr.length - 1; i++) {
        if (res[arr[i]]) {
            continue;
        };
        for (j = i + 1; j < arr.length; j++) {
            if (res[arr[j]]) {
                continue;
            }
            if (arr[i].indexOf(arr[j]) !== -1 || arr[j].indexOf(arr[i]) !== -1) {
                res[arr[i]] = true;
                res[arr[j]] = true;
            }
        };
    };
    const result = arr.filter(el => res[el]);
    return result;
};
console.log(findStringCombinations(arr));

出力結果

コンソールに出力される結果は次のとおりです。

[ 'abc', 'abcd', 'abcde' ]

コードの仕組み

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

まず、二重ループによって配列内のすべての文字列ペアを比較します。String.prototype.indexOf() メソッドを使用し、一方の文字列がもう一方の中に含まれているかどうかを判定します。indexOf() の戻り値が -1 以外であれば、そのペアは部分文字列の関係にあるとみなされ、補助用オブジェクト res にフラグとして記録されます。

また、すでにフラグが立った文字列は continue でスキップされるため、同じ文字列が何度も評価される無駄がありません。

最後に Array.prototype.filter() を使って、フラグが立った要素のみを元の配列の順序のまま抽出し、結果として返しています。

  1. JavaScript配列から一意の値(重複なし)を取得する方法

    JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <

  2. C#で文字列内のすべての部分文字列を検索するプログラム

    C#では、Substring()メソッドを使うことで、文字列内のすべての部分文字列(サブストリング)を簡単に取り出すことができます。基本的な考え方たとえば、次のような文字列を考えてみましょう。Xyzこの文字列からすべての部分文字列を取得するには、部分文字列の長さを1から順に変えながら、開始位置を先頭から末尾までループ処理します。各位置に対してSubstring()メソッドを呼び出し、該当する部分文字列を抽出します。for (int start = 0; start <= str.Length - i; start++) { string substr = str.Substrin