文字列内の各文字から最も近い母音までの距離を求める方法(JavaScript)
JavaScriptで、少なくとも1つの母音(a・e・i・o・u)を含む文字列を受け取る関数を作成することを考えてみましょう。この関数は、文字列内の各文字ごとに、最も近い母音までの距離を数値として対応付けた配列を返す必要があります。
問題の例
たとえば、次のような文字列が入力されたとします。
const str = 'vatghvf';
この場合、期待される出力は次のようになります。
const output = [1, 0, 1, 2, 3, 4, 5];
出力の意味を見てみましょう。インデックス1の「a」は母音そのものなので距離は0。先頭の「v」は「a」まで1文字離れているため1。3番目以降の「t」「g」「h」「v」「f」は、直前の母音「a」(インデックス1)から順に2、3、4、5、6離れていますが、ここでは左側の母音との距離がそのまま採用されています。
実装コード
以下が実際のコードです。
const str = 'vatghvf';
// 配列の中から指定した値に最も近い要素との差を求めるヘルパー関数
const nearest = (arr = [], el) => arr.reduce((acc, val) => Math.min(acc,
Math.abs(val - el)), Infinity);
// 各文字について最寄りの母音までの距離を計算する本体関数
const vowelNearestDistance = (str = '') => {
const s = str.toLowerCase();
const vowelIndex = [];
for(let i = 0; i < s.length; i++){
if(s[i] === 'a' || s[i] === 'e' || s[i] === 'i' || s[i] === 'o' ||
s[i] === 'u'){
vowelIndex.push(i);
};
};
return s.split('').map((el, ind) => nearest(vowelIndex, ind));
};
console.log(vowelNearestDistance(str));
コードの解説
このコードの処理の流れは次のとおりです。
- 小文字への正規化:まず
toLowerCase()で文字列をすべて小文字に変換し、大文字の母音(A や E など)にも対応できるようにします。 - 母音の位置を収集:文字列を走査し、母音である文字のインデックスを
vowelIndex配列に記録します。 - 距離の算出:
map()を使って各文字のインデックスに対し、nearest()関数で母音インデックス群との絶対差の最小値を求めます。reduce()の初期値にInfinityを設定することで、必ず実在する最小距離が残る仕組みです。
実行結果
コンソールには以下のように出力されます。
[
1, 0, 1, 2,
3, 4, 5
]
このように、文字列中のすべての文字について最も近い母音までの距離を効率的に求めることができます。なお、このアルゴリズムの計算量は O(n×m)(n は文字列の長さ、m は母音の個数)ですが、両端からの母音位置を事前計算して左右を比較する方式に書き換えれば、O(n) まで最適化することも可能です。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptで文字列内の文字を英字・数字・特殊文字に再グループ化する方法
問題文字列 str を第一引数(唯一の引数)として受け取る JavaScript 関数を作成する必要があります。この文字列には、次の3種類の文字が含まれる可能性があります。英字:(A-Z)、(a-z)数字:0〜9特殊文字:上記以外のすべての文字関数は文字列を先頭から順に走査し、ちょうど3つの要素からなる配列を構築します。1番目の要素には文字列に含まれるすべての英字、2番目には数字、3番目には特殊文字を格納し、それぞれ元の文字列内での出現順(相対的な順序)を維持します。最後にこの配列を返します。例えば、関数への入力が次の場合を考えてみましょう。入力const str = thi!1s is S@