JavaScriptで文字列を結合して回文(パリンドローム)ペアを見つける方法
問題の概要
文字列の配列を引数として受け取るJavaScript関数を作成します。この関数は、配列内の文字列同士を結合したときに回文(パリンドローム)となるすべてのインデックスペアを、配列の配列として返す必要があります。
例えば、関数への入力が次のような場合を考えてみましょう。
const arr = ['tab', 'cat', 'bat'];
この場合、期待される出力は次のとおりです。
const output = [[0, 2], [2, 0]];
出力の解説
これは、「battab」と「tabbat」がどちらも回文であるためです。つまり、インデックス0の「tab」とインデックス2の「bat」は、どちらの順序で結合しても回文になります。
コード例
この問題を解くコードは以下のとおりです。
const arr = ['tab', 'cat', 'bat'];
// 文字列が回文かどうかを判定するヘルパー関数
const isPalindrome = (str = '') => {
let i = 0;
let j = str.length - 1;
while (i < j) {
if (str[i] != str[j]) return false;
i++;
j--;
};
return true;
};
// 回文になるペアのインデックスをすべて見つけるメイン関数
const palindromePairs = (arr = []) => {
const res = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (isPalindrome(arr[i] + arr[j])) {
res.push([i, j])
}
if (isPalindrome(arr[j] + arr[i])) {
res.push([j, i])
};
};
};
return res;
};
console.log(palindromePairs(arr));
コードの解説
ここでは、まずisPalindrome()というヘルパー関数を定義しています。この関数は、文字列の先頭と末尾から順番に文字を比較していくことで、その文字列が回文かどうかを判定します。途中で一致しない文字が見つかれば即座にfalseを返し、最後まで比較できればtrueを返します。
続いてメインのpalindromePairs()関数では、二重ループを使って配列内のすべての文字列の組み合わせを生成しています。各ペアに対して「前+後ろ」と「後ろ+前」の両方の結合順序をチェックし、条件を満たすものについては、そのインデックスペアを結果配列resに追加していきます。なお、同じペアでも結合の順序によって回文になる・ならないが変わるため、両方向のチェックが必要です。
出力結果
コンソールには以下のように出力されます。
[ [ 0, 2 ], [ 2, 0 ] ]
-
JavaScriptのテンプレート文字列(テンプレートリテラル)とは?基本の使い方を解説
テンプレート文字列(テンプレートリテラル)とは テンプレート文字列は、ES6(ECMAScript 2015)で導入された機能で、文字列の中に式を直接埋め込むことを可能にしました。従来のシングルクォート()やダブルクォート()の代わりに、バッククォート(``)を使用する点が特徴です。 テンプレート文字列を使うと、文字列の連結や補間(インターポレーション)がはるかに直感的に行えます。例えば ${a + b} のように記述することで、文字列の中に任意の式をそのまま埋め込めます。従来のように + 演算子で文字列をつなぎ合わせる方法と比べると、はるかに読みやすく美しい構文です。 JavaScriptに
-
JavaScriptでテンプレート文字列をネストする方法
JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ