問題 #18 ・ 文字列処理 ・ 難易度 3
次の関数 isPalindrome は、文字列 s が回文(先頭から読んでも末尾から読んでも同じ文字列)であるかどうかを判定し、回文であれば true を、そうでなければ false を返す。プログラム中の〔 a 〕と〔 b 〕に入れる字句の正しい組合せを、選択肢の中から選べ。 ここで、s[k] は文字列 s の k 番目の文字を返す。sの文字数 は文字列 s に含まれる文字の個数を返す。 例えば、isPalindrome("abcba") は true を返し、isPalindrome("abcd") は false を返す。
○論理型: isPalindrome(文字列型: s)整数型: len ← sの文字数整数型: left ← 1整数型: right ← 〔 a 〕while (left < right)if (s[left] ≠ s[right])return falseendifleft ← left + 1right ← 〔 b 〕endwhilereturn true
この関数は、文字列の先頭(left)と末尾(right)から1文字ずつ中央に向かって比較する典型的な回文判定アルゴリズムである。 【正解の確認トレース】a = len、b = right - 1 の場合 ■ isPalindrome("abcba") のトレース(len = 5) left=1, right=5 ループ1回目: left=1 < right=5 → s[1]='a' = s[5]='a' → left←2, right←4 ループ2回目: left=2 < right=4 → s[2]='b' = s[4]='b' → left←3, right←3 ループ3回目: left=3 < right=3 は偽 → ループ終了 return true ✓ ■ isPalindrome("abcd") のトレース(len = 4) left=1, right=4 ループ1回目: left=1 < right=4 → s[1]='a' ≠ s[4]='d' → return false ✓ 【各誤答の問題点】 ・イ(a=len-1): right の初期値が末尾の1つ手前になり、最後の文字が比較されない。 ・ウ(b=len-left): left の更新後に right を計算するため、対称位置がずれる。 ・エ(b=left): right が left と同じ値になり、自分自身との比較になってしまう。 ・オ(a=len-1, b=len-left): イとウの誤りが組み合わさり、初期値も更新式も正しくない。 ・カ(b=right-2): right の減少量が left の増加量と合わず、対称位置がずれる。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。