問題2 解説

 与えられた文字列に問題の操作を 1 回施す方法だけを解説しよう.これを n 回繰り返せばよい.
 まず,文字列の左端の文字に注目し,2 文字目以降を検査して行きながら,現在注目している文字と同じときはカウントを増加させ,異なるときは現在のカウントと注目している文字を新しい文字列に書き加え,注目している文字をそのとき読んだ文字に変更し,カウントを 1 に戻す.この作業を文字列の右端まで行う. あらかじめ文字列の右端に数字以外の文字,例えば空白文字を 番兵 (centinel) として加えておけば,文字列を左端から右端まで 1 度読むだけで操作は終了する.

 与えられた文字列  st = "s0 s1 ・・・ sL"  (s0, s1, ・・・, sL それぞれは 1 文字)に上述の操作を施す関数は次のようになる.

  function 文字列の操作
  begin
   st = st + " " ;  /* st の末尾に空白文字をつける.+ は文字列の連結を表す */
   result = "" ;   /* result は操作を施した文字列(最初は空の文字列) */
   ch = s0 ;     /* ch は現在注目している文字 */
   count = 1 ;
   for i = 1 to L + 1
   begin
    if si = ch then
     count = count + 1 ;
    else
    begin
     result = result + toString (count) + toString (ch) ;
      /* toString は整数や文字を文字列に変換する関数 */
     ch = si+1 ;
     count = 1 ;
    end
   end
   return result ;
  end

最後に,プログラミング言語に依存することであるが,式
  result = result + toString (count) + toString (ch)
を実現するには, C 言語では
  sprintf(result, "%s%d%c", result, count, ch)
Java では
  result = result + count + ch
とすればよい.