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

JavaScriptで文字列から構築できる回文(パリンドローム)の数を数える方法

本記事では、文字列と数値を引数として受け取り、その文字列に含まれる文字を使って構築できる「指定した長さの回文」の総数を求めるJavaScript関数の実装方法を解説します。

問題の概要

第一引数に文字列(str)、第二引数に数値(num)を受け取るJavaScript関数を作成します。この関数は、与えられた文字列strの文字を組み合わせて、ちょうどnum文字となる回文が何通り作れるかを数え、その個数を返す必要があります。

たとえば、入力が以下の場合を考えてみましょう。

const str = 'ij';
const num = 4;

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

const output = 4;

これは、次の4つの回文が構築できるためです。

'iiii', 'jjjj', 'ijji', 'jiij'

アプローチ

まず、ハッシュセット(Set)を使って、与えられた文字列に含まれる一意な文字の種類数を数えます。この種類数をuとします。

回文の長さ(num)が奇数の場合、中央の文字は左右対称の制約を受けないため、u通りの候補から自由に選ぶことができます。

一方、numが偶数の場合、作れる回文の総数は次の式で表されます。

power(u, num / 2)

さらにnumが奇数の場合は、中央の位置の選択肢としてu通りが加わるため、この値にuを掛け合わせればよいことになります。

コード例

以下が実際の実装コードです。

const str = 'ij';
const num = 4;

const findValidPalindromes = (str = '', num = 1) => {
    const set = new Set();
    for (let i = 0; i < str.length; i++) {
        const el = str[i];
        set.add(el);
    }
    const u = set.size;
    if (num & 1) {
        return Math.pow(u, num / 2) * u;
    } else {
        return Math.pow(u, num / 2);
    }
};

console.log(findValidPalindromes(str, num));

出力結果

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

4
  1. JavaScriptで数値を回文にするまでのステップ数を求める方法

    問題数値 num を第一かつ唯一の引数として受け取るJavaScript関数を作成します。この関数は、与えられた数値を回文(左から読んでも右から読んでも同じ並びになる数)にするために必要な「特別なステップ」の回数を返します。ここでいう特別なステップとは、「桁を逆順に並べ替えて、元の数値に加算する」という操作のことです。加算した結果がまだ回文になっていない場合は、その合計値に対して同じ操作を、回文が得られるまで繰り返します。例えば、関数への入力が次の場合を考えてみましょう。入力const num = 87;出力const output = 4;出力の解説答えが4になるのは、以下のステップを経るた

  2. Pythonで指定された文字列の文字から作成できるサイズkの回文の総数を数える方法

    アルファベット文字からなる文字列 s と整数 k が与えられたとします。このとき、s に含まれる文字だけを使って構成できる「長さ k の回文」の総数を求めます。同じ文字は何度でも繰り返し使用して構いません。例えば、入力が s = xy、k = 4 の場合、出力は 4 になります。これは、作成できる回文が [xxxx, yyyy, xyyx, yxxy] の 4 通りだからです。解法のアプローチこの問題は、回文の性質を利用すると非常にシンプルに解けます。長さ k の回文では、前半部分が決まれば後半部分は自動的に鏡像として決まるため、自由に選べるのは前半の文字だけです。さらに k が奇数の場合は、