【JavaScript】配列内の連続するn個の文字列を結合して最長の文字列を求める方法
問題概要
文字列の配列と整数 n を受け取り、配列内の「連続する n 個の文字列」をすべて組み合わせて結合した文字列の中から、最も長いものを返す JavaScript 関数を作成します。同じ長さの候補が複数存在する場合は、最初に出現したものを返すのがポイントです。
実装のポイント
- 入力チェック: 配列が空である、n が配列の長さを超えている、または n が 0 以下の場合は空文字列 '' を返します。
- 部分配列の抽出: Array.prototype.slice(i, i + k) を使って、各位置から連続する k 個の要素を取り出します。
- 結合と比較: join('') で結合した文字列の長さを現在の最長文字列と比較し、より長ければ更新します。比較に厳密な不等号(>)を使用することで、同長の場合は先に見つかった文字列が優先されます。
コード例
const arr = ["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"];
const num = 2;
function longestConsec(strarr, k) {
// 入力チェック:無効な場合は空文字列を返す
if (strarr.length === 0 || k > strarr.length || k <= 0) return '';
let longStr = '';
let newStr = '';
for (let i = 0; i < strarr.length; i++) {
newStr = strarr.slice(i, i + k);
if (newStr.join('').length > longStr.length) {
longStr = newStr.join('');
}
}
return longStr;
}
console.log(longestConsec(arr, num));
出力結果
abigailtheta
コードの解説
この例では num = 2 なので、隣り合う 2 つの文字列を順番に結合しながら長さを比較していきます。実際の処理の流れは次の通りです。
| 開始位置 | 結合結果 | 文字数 |
|---|---|---|
| 0 | zoneabigail | 11 |
| 1 | abigailtheta | 12 |
| 2 | thetaform | 9 |
| 3 | formlibe | 8 |
| 4 | libezas | 7 |
| 5 | zastheta | 8 |
| 6 | thetaabigail | 12 |
最も長いのは 12 文字の "abigailtheta" と "thetaabigail" の 2 つです。しかし、長さの比較に「より大きい(>)」を使っているため、後から見つかった同じ長さの文字列では既存の結果が上書きされません。その結果、最初に出現した "abigailtheta" が出力されます。
計算量について
ループの各回で slice と join が行われるため、このアルゴリズムの時間計算量は O(n × k)(n は配列の長さ、k は結合する個数)となります。配列サイズや k が非常に大きい場合を除けば、十分に実用的なパフォーマンスです。
まとめ
slice と join を組み合わせれば、連続する n 個の文字列を結合して最長のものを求める処理をシンプルに実装できます。境界条件(空配列や不正な k)への対応を忘れなければ、堅牢で読みやすい関数になります。
-
バニラJavaScriptで文字列を数値に変換する方法|parseInt関数の使い方を解説
parseInt関数とはバニラJavaScriptで文字列を数値に変換する最も基本的な方法が、グローバル関数のparseIntです。この関数は、文字列として渡された値を指定した基数(進数)に基づいて解釈し、整数を返します。構文parseInt(string, radix);各引数の意味は以下の通りです。string ― 解析対象となる値です。引数が文字列以外の場合は、ToStringメソッドによって自動的に文字列へ変換されます。また、先頭の空白文字は無視されます。radix ― 文字列の基数(数学的な記数法における底)を表す、2から36までの整数です。基数を指定してさまざまな進数を整数に変換で
-
JavaScriptのテンプレート文字列(テンプレートリテラル)とは?基本の使い方を解説
テンプレート文字列(テンプレートリテラル)とは テンプレート文字列は、ES6(ECMAScript 2015)で導入された機能で、文字列の中に式を直接埋め込むことを可能にしました。従来のシングルクォート()やダブルクォート()の代わりに、バッククォート(``)を使用する点が特徴です。 テンプレート文字列を使うと、文字列の連結や補間(インターポレーション)がはるかに直感的に行えます。例えば ${a + b} のように記述することで、文字列の中に任意の式をそのまま埋め込めます。従来のように + 演算子で文字列をつなぎ合わせる方法と比べると、はるかに読みやすく美しい構文です。 JavaScriptに