JavaScriptで文字列内のアルファベットだけを反転する方法
問題の概要
JavaScriptで、アルファベットといくつかの特殊文字(記号)が混在する文字列 str を受け取る関数を作成することを求められています。
この関数は、入力文字列をもとに新しい文字列を返します。その際のルールは次のとおりです。
- アルファベット以外の文字(記号・数字など)は、元の位置にそのまま留まります。
- アルファベットの文字だけが、互いに反転した位置へ移動します。
入力例と出力例
たとえば、関数への入力が以下だった場合を考えてみましょう。
入力
const str = 'k_lmn_opq';
出力
const output = 'q_pon_mlk';
「_」という記号は位置が変わっておらず、アルファベット部分(klmnopq)だけが逆順(qponmlk)になっていることがわかります。
解決アプローチ:両端からの二重ポインタ法
この問題は、「二重ポインタ(ツーポインタ)」と呼ばれるテクニックを使うと効率的に解けます。手順は以下のとおりです。
- 文字列を1文字ずつの配列に分解します。
- 左端(left)と右端(right)にそれぞれポインタを置きます。
- 左ポインタを右へ進め、最初に見つかった「アルファベット」で停止させます。
- 右ポインタを左へ進め、最初に見つかった「アルファベット」で停止させます。
- 2つの文字を入れ替え、両方のポインタを中央に向けて1つずつ進めます。
- left が right を追い越すまで、この処理を繰り返します。
この方法なら、記号の位置を保ちながらアルファベットだけを反転できます。計算量は O(n) と非常に効率的です。
コード例
const str = 'k_lmn_opq';
const reverseAlphabets = (str) => {
// 文字列を1文字ずつの配列に変換
const arr = str.split('')
let left = 0
let right = arr.length - 1
// 配列内の2つの要素を入れ替えるヘルパー関数
const swap = (a, b) => {
const temp = arr[a]
arr[a] = arr[b]
arr[b] = temp
}
// 引数が英字かどうかを判定するヘルパー関数
const isLetter = (x = '') => /[a-zA-Z]/.test(x)
while (left <= right) {
// 左側から英字を見つけるまでポインタを進める
while (!isLetter(arr[left])) {
left += 1
if (left > right) {
break
}
}
// 右側から英字を見つけるまでポインタを進める
while (!isLetter(arr[right])) {
right -= 1
if (left > right) {
break
}
}
// ポインタが交差したら終了
if (left > right) {
break
}
// 英字同士を入れ替えて、ポインタを中央へ進める
swap(left, right)
left += 1
right -= 1
}
// 配列を再び文字列に連結して返す
return arr.join('')
};
console.log(reverseAlphabets(str));実行結果
q_pon_mlk
コードのポイント解説
- split('') と join(''):文字列は直接インデックスで書き換えられないため、一度配列に変換して操作し、最後に文字列へ戻しています。
- isLetter 関数:正規表現
/[a-zA-Z]/を使って、対象の文字が英字かどうかを判定します。これにより記号や数字をスキップできます。 - swap 関数:一時変数 temp を使って配列の2要素を入れ替える、定番の手法です。
- while ループ:左右のポインタが交差するまで英字を入れ替え続けることで、全体を1回の走査で処理でき、時間計算量は O(n) に抑えられます。
このように、二重ポインタ法を活用すれば、記号や数字などの位置を崩さずに、文字列中のアルファベットだけを効率よく反転させることができます。
-
JavaScriptの正規表現(RegExp)で文字列を置換する方法をわかりやすく解説
JavaScriptの正規表現で文字列を置換する基本JavaScriptで正規表現(RegExp)を使って文字列を置換するには、文字列オブジェクトのreplace()メソッドを使用します。replace()メソッドは、第一引数に検索したい正規表現パターン、第二引数に置換後の文字列を指定するだけで、簡単に文字列の置き換えが行えます。サンプルコード以下のコードは、正規表現を使って文字列の一部を置換する実際の例です。ブラウザで実行して動作を確認してみてください。<html> <head> <script&g
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>