Length of Last Word

文字列の最後の単語の長さを求めるアルゴリズムの詳細解析

TypeScript実装

lengthOfLastWord.ts
1  /**
2   * 文字列の最後の単語の長さを返す関数
3   * @param s - 英字とスペースで構成された文字列
4   * @returns 最後の単語の長さ
5   */
6  function lengthOfLastWord(s: string): number {
7      // 文字列の末尾から開始して、スペースをスキップ
8      let i = s.length - 1;
9  
10     // 末尾のスペースをスキップ
11     while (i >= 0 && s[i] === ' ') {
12         i--;
13     }
14 
15     // 最後の単語の長さをカウント
16     let length = 0;
17     while (i >= 0 && s[i] !== ' ') {
18         length++;
19         i--;
20     }
21 
22     return length;
23 }

ステップバイステップ解析

ステップ 1: 初期化
文字列の末尾インデックス (s.length - 1) を設定
i = s.length - 1
ステップ 2: 末尾スペーススキップ
文字列末尾から連続するスペースをスキップ
while (i >= 0 && s[i] === ' ') { i--; }
ステップ 3: 単語長カウント
最後の単語の文字数を逆向きにカウント
while (i >= 0 && s[i] !== ' ') { length++; i--; }
ステップ 4: 結果返却
カウントした長さを返却
return length

計算量解析

⏱ 時間計算量
O(n)
最悪の場合、文字列全体を走査する必要がある
💾 空間計算量
O(1)
定数の追加メモリのみ使用
🎯 最適化ポイント
  • • 配列操作を回避
  • • 逆向き走査で効率化
  • • メモリ使用量最小化

実行例の可視化

例1: "Hello World"

文字列:
H e l l o W o r l d
最後の単語 "World" (長さ: 5)

例2: " fly me to the moon "

文字列:
f l y m e t o t h e m o o n
最後の単語 "moon" (長さ: 4) スキップされるスペース

他のアプローチとの比較

アプローチ 時間計算量 空間計算量 メモリ効率
逆向き走査(採用) O(n) O(1) 最も効率的
split() + pop() O(n) O(n) 配列作成でメモリ消費
trim() + lastIndexOf() O(n) O(n) 文字列操作でオーバーヘッド
正規表現 O(n) O(m) パターンマッチング負荷