同じ文字が続く最長の長さ|擬似言語のトレース解説と練習問題

レベル:基礎 / タグ:for・if・else・文字・配列

関数 longestRun は、文字の配列 s の中で、同じ文字が連続する部分の最長の長さを返す。配列の要素番号は 1 から始まる。

プログラム

1○整数型: longestRun(文字型の配列: s)
2 整数型: best ← 1
3 整数型: run ← 1
4 整数型: i
5 for (i を 2 から sの要素数 まで 1 ずつ増やす)
6 if (s[i] = s[i - 1])
7 run ← run + 1
8 else
9 run ← 1
10 endif
11 if (run > best)
12 best ← run
13 endif
14 endfor
15 return best

何をしているか

文字を先頭から順に見て、1つ前の文字と同じなら「今続いている長さ」run を 1 増やし、違えば 1 に戻します。run が「これまでの最長」best を超えたら、best を書き換えます。

トレースのコツ

  • 表の列は i、s[i - 1]、s[i]、run、best にします。
  • 1回の繰返しで if が2つあります。1つ目で run が決まり、2つ目でその run を best と比べます。
  • 繰返しは 2 から始まります。1文字目には「1つ前」がないからです。

よくある間違い

  • 違う文字が来たとき、run を 0 に戻す。その文字自身で長さ 1 なので、1 に戻します。
  • best も一緒に戻してしまう。best は最長の記録なので、減ることはありません。
  • run と best が等しいときに best を書き換えると考える。条件は「より大きい」です。

例題:longestRun({"a", "b", "c", "b", "b", "b", "c"}) を最後まで追う

上のプログラムを longestRun({"a", "b", "c", "b", "b", "b", "c"}) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことsbestruni
12宣言{"a", "b", "c", "b", "b", "b", "c"}1——
23宣言{"a", "b", "c", "b", "b", "b", "c"}11—
34宣言{"a", "b", "c", "b", "b", "b", "c"}11未設定
45繰返しの初期化{"a", "b", "c", "b", "b", "b", "c"}112
55条件判定(真){"a", "b", "c", "b", "b", "b", "c"}112
66条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}112
79代入{"a", "b", "c", "b", "b", "b", "c"}112
811条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}112
95繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}113
105条件判定(真){"a", "b", "c", "b", "b", "b", "c"}113
116条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}113
129代入{"a", "b", "c", "b", "b", "b", "c"}113
1311条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}113
145繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}114
155条件判定(真){"a", "b", "c", "b", "b", "b", "c"}114
166条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}114
179代入{"a", "b", "c", "b", "b", "b", "c"}114
1811条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}114
195繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}115
205条件判定(真){"a", "b", "c", "b", "b", "b", "c"}115
216条件判定(真){"a", "b", "c", "b", "b", "b", "c"}115
227代入{"a", "b", "c", "b", "b", "b", "c"}125
2311条件判定(真){"a", "b", "c", "b", "b", "b", "c"}125
2412代入{"a", "b", "c", "b", "b", "b", "c"}225
255繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}226
265条件判定(真){"a", "b", "c", "b", "b", "b", "c"}226
276条件判定(真){"a", "b", "c", "b", "b", "b", "c"}226
287代入{"a", "b", "c", "b", "b", "b", "c"}236
2911条件判定(真){"a", "b", "c", "b", "b", "b", "c"}236
3012代入{"a", "b", "c", "b", "b", "b", "c"}336
315繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}337
325条件判定(真){"a", "b", "c", "b", "b", "b", "c"}337
336条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}337
349代入{"a", "b", "c", "b", "b", "b", "c"}317
3511条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}317
365繰返しの更新{"a", "b", "c", "b", "b", "b", "c"}318
375条件判定(偽){"a", "b", "c", "b", "b", "b", "c"}318
3815戻る(3){"a", "b", "c", "b", "b", "b", "c"}318

この例題で問われること

問 longestRun({"a", "b", "c", "b", "b", "b", "c"}) を呼び出したときの戻り値はどれか。

答え 3

  • 戻り値になる best は、1 → 2 → 3 と変わります。
  • 15行目で返す時点の値 3 が答えです。

問 7行目を1回目に実行した直後の、変数 run の値はどれか。

答え 2

  • 7行目は全部で2回実行されます。
  • 実行した直後の run は、順に 2 → 3 です。
  • 1回目の直後なので、答えは 2 です。

問 9行目が実行される回数はどれか。

答え 4

  • 9行目は4回実行されます。トレース表で 9行目の行を数えると確かめられます。

練習問題 標準(5問)

本試験と同じくらいの量。レベル:基礎

  1. 問題01 longestRun({"a", "a", "b", "a", "b"})
  2. 問題02 longestRun({"a", "a", "a", "a", "b"})
  3. 問題03 longestRun({"a", "b", "b", "b", "a"})
  4. 問題04 longestRun({"b", "b", "b", "b", "a"})
  5. 問題05 longestRun({"b", "a", "a", "a", "a"})
もっと解く(追加の10問)
  1. 問題06 longestRun({"a", "a", "b", "a", "a"})
  2. 問題07 longestRun({"a", "b", "b", "b"})
  3. 問題08 longestRun({"a", "a", "b", "a"})
  4. 問題09 longestRun({"b", "b", "b", "a", "a"})
  5. 問題10 longestRun({"a", "b", "a", "a", "b"})
  6. 問題11 longestRun({"b", "b", "a", "b"})
  7. 問題12 longestRun({"b", "b", "a", "b", "b"})
  8. 問題13 longestRun({"a", "a", "a", "b"})
  9. 問題14 longestRun({"a", "a", "a", "b", "b"})
  10. 問題15 longestRun({"b", "b", "b", "a"})

練習問題 じっくり(10問)

長めのトレースで力をつける。レベル:中級

  1. 問題01 longestRun({"b", "c", "a", "a", "a", "c", "b", "c", "b"})
  2. 問題02 longestRun({"c", "c", "b", "a", "a", "b", "c", "c"})
  3. 問題03 longestRun({"c", "b", "b", "a", "a", "a", "a", "a"})
  4. 問題04 longestRun({"b", "b", "c", "c", "c", "c", "b", "a"})
  5. 問題05 longestRun({"a", "c", "c", "b", "a", "b", "c", "c", "c"})
  6. 問題06 longestRun({"a", "c", "c", "c", "c", "c", "c", "b"})
  7. 問題07 longestRun({"c", "a", "c", "c", "b", "a", "b", "c", "c"})
  8. 問題08 longestRun({"a", "b", "c", "b", "a", "a", "b", "c", "c"})
  9. 問題09 longestRun({"a", "b", "a", "a", "c", "a", "b", "a", "a"})
  10. 問題10 longestRun({"c", "a", "a", "a", "a", "c"})
もっと解く(追加の20問)
  1. 問題11 longestRun({"a", "a", "c", "c", "c", "c", "a"})
  2. 問題12 longestRun({"b", "a", "a", "a", "c", "b", "c", "a", "c"})
  3. 問題13 longestRun({"b", "c", "c", "b", "b", "b", "c", "c"})
  4. 問題14 longestRun({"c", "c", "a", "c", "c", "a", "a"})
  5. 問題15 longestRun({"a", "a", "c", "c", "a", "a", "c", "b", "a"})
  6. 問題16 longestRun({"c", "b", "b", "a", "a", "a"})
  7. 問題17 longestRun({"b", "c", "b", "a", "a", "a", "b", "a"})
  8. 問題18 longestRun({"b", "b", "a", "c", "b", "b", "c", "b"})
  9. 問題19 longestRun({"a", "b", "a", "a", "b", "b", "a", "a"})
  10. 問題20 longestRun({"c", "c", "b", "b", "b", "b", "c"})
  11. 問題21 longestRun({"c", "b", "b", "b", "c", "a", "b"})
  12. 問題22 longestRun({"b", "b", "b", "c", "a", "b", "b", "b"})
  13. 問題23 longestRun({"b", "a", "c", "c", "c", "c"})
  14. 問題24 longestRun({"b", "a", "a", "b", "b", "a", "b", "c"})
  15. 問題25 longestRun({"b", "b", "c", "c", "a", "c", "b", "b"})
  16. 問題26 longestRun({"a", "c", "c", "b", "b", "b"})
  17. 問題27 longestRun({"a", "a", "b", "c", "a", "a", "b"})
  18. 問題28 longestRun({"b", "b", "c", "c", "b", "b", "c", "a", "c"})
  19. 問題29 longestRun({"b", "b", "c", "b", "b", "a", "c", "a"})
  20. 問題30 longestRun({"a", "b", "a", "a", "b", "c", "a", "c", "c"})

ほかのアルゴリズム