JavaScriptで回文(パリンドローム)文字列を判定する関数の実装方法
今回は、文字列を引数として受け取り、その文字列が回文(パリンドローム)であれば true を、そうでなければ false を返す JavaScript 関数を作成します。
回文とは?
回文とは、前から読んでも後ろから読んでも同じ文字列のことを指します。
例えば、以下のような文字列が回文に該当します。
- 'madam'
- 'dad'
- 'abcdcba'
条件
今回の実装における唯一の条件は、組み込みの文字列メソッドを使用せず、文字列を配列に変換もしないことです。つまり、reverse() や split() といった便利なメソッドに頼らず、純粋なロジックだけで判定を行う必要があります。
解決アプローチ:両端からの比較
最も効率的な方法は、文字列の先頭と末尾から順番に文字を比較していく「ツーポインタ方式」です。具体的な手順は以下のとおりです。
- 文字列の先頭位置を指すインデックス
startと、末尾位置を指すインデックスendを用意する。 startがendより小さい間、両端の文字を比較する。- 一致しない文字が見つかった時点で
falseを返す。 - すべての比較が終われば、その文字列は回文であるため
trueを返す。
コード例
const str = 'madam';
const isPalindrome = (str = '') => {
const { length } = str;
let start = 0, end = length - 1;
while(start < end){
const leftChar = str[start];
const rightChar = str[end];
if(leftChar !== rightChar){
return false;
};
start++;
end--;
};
return true;
};
console.log(isPalindrome(str));
console.log(isPalindrome('avsssvsa'));実行結果
コンソールには以下のように出力されます。
true false
コードの解説
まず、分割代入を使って文字列の長さを取得し、start は先頭(0)、end は末尾(length - 1)に初期化します。
while ループの中では、両端の文字 leftChar と rightChar を比較し、1つでも異なる文字があれば即座に false を返して処理を終了します。一致している場合は start を1つ進め、end を1つ戻して中央に向かって比較を続けます。
ループが最後まで完了した場合は、どの位置でも文字の不一致がなかったことになるため、true を返します。
このアルゴリズムの計算量は O(n/2)、つまり O(n) であり、文字列の半分だけ比較すれば済むため非常に効率的です。また、余分な配列を作成しないため、メモリの観点でも優れた実装と言えます。
-
JavaScriptで文字列を関数に変換する方法【eval()メソッドの使い方】
JavaScriptで文字列を関数として扱うには、eval()メソッドを使用します。このメソッドは文字列を引数として受け取り、その内容をコードとして評価し、関数へと変換します。構文eval(string);使用例次の例では、文字列の中の「age」プロパティに関数が定義されています。まずJSON.parse()で文字列をオブジェクトに変換し、その後eval()を使ってageプロパティの文字列を実際の関数として評価・変換し、呼び出した結果を出力しています。<html><body><script> var string = {name:Ram, age:fu
-
JavaScriptのfind()関数とは?配列から条件に合う最初の要素を取得する方法
JavaScriptのfind()メソッドは、配列の中から指定した条件を満たす最初の要素の値を返すために使用されます。条件を満たす要素がひとつも存在しない場合は、undefinedが返されます。find()は配列全体を走査しますが、条件に一致する要素が見つかった時点で処理を終了するため、効率的に目的の要素を取得できるのが特徴です。find()の基本構文array.find(function(val, index, arr), thisValue)パラメータの説明function:各要素に対して実行されるテスト関数val:現在処理中の要素の値(必須)index:現在処理中の要素のインデックス番号