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
-
JavaScriptで数値を回文にするまでのステップ数を求める方法
問題数値 num を第一かつ唯一の引数として受け取るJavaScript関数を作成します。この関数は、与えられた数値を回文(左から読んでも右から読んでも同じ並びになる数)にするために必要な「特別なステップ」の回数を返します。ここでいう特別なステップとは、「桁を逆順に並べ替えて、元の数値に加算する」という操作のことです。加算した結果がまだ回文になっていない場合は、その合計値に対して同じ操作を、回文が得られるまで繰り返します。例えば、関数への入力が次の場合を考えてみましょう。入力const num = 87;出力const output = 4;出力の解説答えが4になるのは、以下のステップを経るた
-
Pythonで指定された文字列の文字から作成できるサイズkの回文の総数を数える方法
アルファベット文字からなる文字列 s と整数 k が与えられたとします。このとき、s に含まれる文字だけを使って構成できる「長さ k の回文」の総数を求めます。同じ文字は何度でも繰り返し使用して構いません。例えば、入力が s = xy、k = 4 の場合、出力は 4 になります。これは、作成できる回文が [xxxx, yyyy, xyyx, yxxy] の 4 通りだからです。解法のアプローチこの問題は、回文の性質を利用すると非常にシンプルに解けます。長さ k の回文では、前半部分が決まれば後半部分は自動的に鏡像として決まるため、自由に選べるのは前半の文字だけです。さらに k が奇数の場合は、