科目Bで頻出の文字列操作。char配列の走査と、よく出るパターン (回文判定・置換・カウント) を擬似言語で読みこなします。
文字列処理って、配列と何が違うの?
基本的には文字 (char) の配列なのよ。
s[1] は s の1文字目、s の要素数 が文字列の長さ、というふうに扱うわ。
頻出パターンを見ていきましょう。
例えば回文判定、前から読んでも後ろから読んでも同じかを判定するものですね:
○ 手続: isPalindrome(文字型の配列: s)
整数型: i, j
i ← 1
j ← sの要素数
while (i < j)
if (s[i] ≠ s[j])
return 偽
endif
i ← i + 1
j ← j - 1
endwhile
return 真
前 (i) と後ろ (j) から1ずつ近づけていって、すべて一致すれば回文ですね。
一致しないものが出たら即座に偽 (false) を返すパターンです。
次は文字カウントなのぉ?
○ 手続: countChar(文字型の配列: s, 文字型: c)
整数型: i, count
count ← 0
for (i を 1 から sの要素数 まで 1 ずつ増やす)
if (s[i] = c)
count ← count + 1
endif
endfor
return count
シンプルですが、forループ + if + 加算 の3点セットは文字列処理の基本パターンですね。
もう一つ、文字列の連結も典型ね。
新しい配列に1文字ずつコピーしていくのよ:
○ 手続: concat(文字型の配列: a, 文字型の配列: b)
文字型の配列: result
整数型: i
for (i を 1 から aの要素数 まで 1 ずつ増やす)
result[i] ← a[i]
endfor
for (i を 1 から bの要素数 まで 1 ずつ増やす)
result[aの要素数 + i] ← b[i]
endfor
return result
添字の計算が肝じゃん!
あたしは、aの要素数 + i で b を後ろにくっつけるって覚えたよ!
確認クイズ
上記 isPalindrome 手続に文字列 "LEVEL" (要素 L,E,V,E,L) を渡したときの戻り値は何か。
- 真 (true)
- 偽 (false)
- L
- 5
こたえを見る
正解: 1. 真 (true)
L=L, E=E (i=1とj=5、i=2とj=4を比較)、最後 i=3 なので while ループを抜け、すべて一致したため 真 (true) を返します。LEVELは回文なので正解は真。