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

JavaScriptで英字の大文字・小文字を組み合わせた全パターン(順列)を生成する方法

問題概要

文字列 str を第一引数(唯一の引数)として受け取るJavaScript関数を作成する必要があります。

この関数は、文字列に含まれる英字をそれぞれ個別に小文字または大文字へ変換することで新しい文字列を生成し、作成可能なすべての文字列のリストを返します。なお、数字などの英字以外の文字はそのまま維持されます。

たとえば、入力が以下の場合:

入力

const str = 'k1l2';

出力

const output = ["k1l2","k1L2","K1l2","K1L2"];

解法のアプローチ

この問題は再帰(バックトラッキング)を使うことで効率よく解決できます。考え方は次のとおりです。

  • 文字列を先頭から1文字ずつ処理していきます。
  • 現在の文字が英字の場合は、小文字にした場合大文字にした場合の2通りに分岐して再帰呼び出しを行います。
  • 英字以外(数字や記号)の場合は、そのまま文字列に連結して次へ進みます。
  • すべての文字を処理し終えた時点で、構築済みの文字列を結果配列に追加します。

英字が n 個含まれる場合、生成されるパターンの総数は 2n になります。

コード例

以下が実際のコードです:

const str = 'k1l2';
const changeCase = function (S = '') {
    const res = []
    const helper = (ind = 0, current = '') => {
        if (ind >= S.length) {
            res.push(current)
            return
        }
        if (/[a-zA-Z]/.test(S[ind])) {
            helper(ind + 1, current + S[ind].toLowerCase())
            helper(ind + 1, current + S[ind].toUpperCase())
        } else {
            helper(ind + 1, current + S[ind])
        }
    }
    helper()
    return res
};
console.log(changeCase(str));

実行結果

[ 'k1l2', 'k1L2', 'K1l2', 'K1L2' ]

コードのポイント

  • helper 関数がインデックス ind と現在構築中の文字列 current を受け取り、再帰的に処理を進めます。
  • 正規表現 /[a-zA-Z]/ によって、現在の文字が英字かどうかを判定しています。
  • 英字の場合は toLowerCase()toUpperCase() の両方を試すため、すべての大文字・小文字の組み合わせが網羅されます。
  1. JavaScriptでリンクリスト(連結リスト)を作成する方法

    連結リスト(リンクリスト)は、各要素が「データ」と「次の要素への参照」を持つデータ構造です。配列と異なり、要素の挿入や削除を効率的に行えるのが大きな特徴です。この記事では、JavaScriptを使ってシンプルな連結リストを実装する方法を、サンプルコードとともにわかりやすく解説します。 LinkedListクラスとNodeクラスの定義 まず、headをnullで初期化するコンストラクタを持つシンプルなクラスを定義することから始めましょう。あわせて、LinkedListクラスのプロトタイプに、連結リストの各ノードを表すNodeクラスも定義します。 例 class LinkedList { &nbs

  2. JavaScriptでカスタム画像スライダーを作成する方法【初心者向け解説付き】

    Webサイトに動きを加える定番パーツのひとつが「画像スライダー(カルーセル)」です。ライブラリを使わなくても、HTML・CSS・JavaScriptの基本だけで、前後ボタンとナビゲーションドット付きのカスタムスライダーを簡単に作ることができます。この記事では、実際に動作する完全なサンプルコードを紹介しながら、それぞれの仕組みをわかりやすく解説します。完成形のサンプルコード以下のコードをそのままHTMLファイルとして保存し、ブラウザで開くと画像スライダーが動作します。<!DOCTYPE html> <html> <head> <meta name=&qu