そこの解説にある通りっちゃぁ通りなんだけど,整数型変数のcounter,i,j,k が何を表してるか理解することですね。やろうとしてることの中に出てくる数が,どの変数に対応するかを考えること。
また,プログラムを書く上でどの変数は共通に出来て,どの変数は別途作らなければならないか,と言うことも見て覚えましょう。
例として,
10文字あるSourceText(\u0026quot;aabcabcdef\u0026quot; とする)の中から,3文字のPattern(\u0026quot;abc\u0026quot; とする)を探し出すことを考えましょう。
手順1 SourceText の1文字目と,Pattern の1文字目を比べます。
→ 同じです。同じなので,
手順2 SourceText の2文字目と,Pattern の2文字目を比べます。
→ 違います。違うので,
手順3 SourceText の2文字目と,Pattern の1文字目を比べます。
(ここで,2で違ったとしても,3文字目に進んではいけないことに注意)
→ 同じです。同じなので,2と同じことをします。
手順4 SourceText の3文字目と,Pattern の2文字目を比べます。
→ 同じです。同じなので,また文字を進めます。
手順5 SourceText の4文字目と,Pattern の3文字目を比べます。
→ 同じです。Pattern は3文字なので,これで1個見つかりました。見つかった個数を1増やします。
手順6 SourceText の3文字目と,Pattern の1文字目を比べます。
→ 違います。違うので,
手順7 SourceText の4文字目と,Pattern の1文字目を比べます。
→ 違います。違うので,
手順8 SourseText の5文字目と,Pattern の1文字目を比べます。
(上記,3,4,5と同じ操作で,もう1個見つかります
手順9 SourceText の6文字目と,Pattern の1文字目を比べます。
→ 違います。違うので,
手順10 SourceText の7文字目と,Pattern の1文字目を比べます。
→ 違います。違うので,
手順11 SourceText の8文字目と,Pattern の1文字目を比べます。
→ 違います。違うので,
手順12 SourceText の9文字目に行こうと思うけど,あと2文字しかないから絶対あるわけないです。 → 終わり
こうやっていくことになりますが,すぐわかるのは,「SourceText の何文字目か」と言う変数と,「Pattern の何文字目か」と言う変数が必要です。
そしてSurceText の何文字目は戻ることがあります。手順5~手順6では1つ戻りました。手順2~手順3では進みませんでした。他は1ずつ増えています。
だから,「SourceText のここから3個分」の「ここ」を表す変数と,「その3個の中の何文字目」を表す変数が必要だと言うことになります。
「SourceText のここから3個分」の「ここ」を表す変数を「 i 」
i+「その3個の中の何文字目」を「 j 」
「Pattern の何文字目か」を「 k 」 とします。
10行~16行のwhile では,j が増えますがi は増えません。上記の手順2はそのwhile の中の操作なので,手順3に進むときは手順1のときの i (=1)に1足した数になるので,i=2 になっています。
上記手順3~5も同様にj が増えてi はすのままですから,手順6でのi は手順3でのi に1加えたものになります。
だから,bの選択肢は
SouceText の何文字目かを表す「 j 」 …これが「 i 」だと10行~16行のwhile の中で変化しないのでダメです。
aの選択肢は,上記手順12を表しています。
i,j,k の取る変数は,薄々気づいていると思いますが,0,1,2,…です。文字列の最初の文字は「0文字目」,2番目の文字は「1文字目」となっています。
こうしておくことで,\u0026quot;aabcabcdef\u0026quot; の\u0026quot;d\u0026quot;=「7文字目」(8番目)にPatlen の3を足しても10だから,まだ行ける。
\u0026quot;aabcabcdef\u0026quot; の\u0026quot;e\u0026quot;=「8文字目」(9番目)にPatlen の3を足すと11だから,もう無理。 とわかります。
だから,i+Patlen とTextlen を比較し,イコールでももう一度回すように「以下」を使えば良いことになります。
文字で説明するのは厳しいですね。