文字列検索のトレース

■ 解き方の方針 求めるのは検索に成功した回数ではなく、条件式Bの比較が 真になった延べ回数 です。各開始位置iについて、最初に不一致になるまでjを進め、真の回数だけを合計します。 ■ ループ範囲を先に決める dataの要素数は8、keyの要素数は3です。外側のループは $8-3+1=6$ なので、i=1~6を調べます。比較する式はdata[i+j-1]=key[j]です。 ■ iごとのトレース i 比べる data の並び j=1 j=2 j=3 Bが真の回数 1 a b a a=a ○ b=b ○ a≠c × 2 2 b a b b≠a × 0 3 a b c ○ ○ ○(一致→3を追加) 3 4 b c a b≠a × 0 5 c a b c≠a × 0 6 a b c ○ ○ ○(一致→6を追加) 3 ■ 合計する 真になった回数は $2+0+3+0+0+3=8$ 回です。 完全一致はi=3とi=6の2件ですが、条件式Bが真になった回数は途中の一致も含めて8回です。 ■ 正解と誤答の見分け方 8回を示す ク が正解です。2を選ぶと完全一致した開始位置の数を答えたことになります。偽になった比較は条件式が真になった回数へ加えません。

次の記述中の  に入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数 search は、二つの文字型の配列を、それぞれ引数 data 及び key で受け取り、data から、key の要素の並びと同じ並びを全て探し、その先頭の要素番号を全て格納した配列を返す。見つからなければ、要素数0の配列を返す。

関数 search を search ({"a", "b", "a", "b", "c", "a", "b", "c"}, {"a", "b", "c"}) として呼び出すと、 /*** B ***/ の行の条件式が真となる回数は    回である。

[プログラム]
/* keyは、要素数1以上の配列である */
○整数型の配列: search(文字型の配列: data, 文字型の配列: key)
整数型:i, j, lenData, lenKey
整数型の配列: result ← {} // 要素数0の配列
lenData ← dataの要素数
lenKey ← keyの要素数
/* (lenData - lenKey + 1) が0以下のときは繰返し処理を実行しない */
for (iを1から (lenData - lenKey + 1) まで1ずつ増やす)
for (jを1から lenKey まで 1 ずつ増やす) // a
if (data[i + j - 1] が key [j] と等しい) /*** B ***/
if (jが lenKey と等しい)
resultの末尾にiの値を追加する
endif
else
aの行から始まる繰返し処理を終了する
endif
endfor
endfor
return result

出典令和7年度 基本情報技術者試験 科目B 問4
ア
1
イ
2
ウ
3
エ
4
オ
5
カ
6
キ
7
ク
8
ケ
9
コ
10