2026-09-13
is_palindrome.cpp
#include <string_view>
constexpr bool is_palindrome(std::string_view s) {
// write this: true if s reads the same forwards and backwards
}
static_assert(is_palindrome(""));
static_assert(is_palindrome("a"));
static_assert(is_palindrome("level"));
static_assert(is_palindrome("noon"));
static_assert(!is_palindrome("namara"));
ループを使わず、自分自身を呼ぶ形でis_palindromeを実装してください。下のstatic_assertがすべて通ること。
Reference
constexpr bool is_palindrome(std::string_view s) {
return s.size() < 2
|| (s.front() == s.back() && is_palindrome(s.substr(1, s.size() - 2)));
}
「長さ2未満なら回文、そうでなければ両端が等しく、かつ内側が回文」という定義を1つの式に写したものです。||と&&の短絡評価がそのまま基底ケースと打ち切りになり、空文字列でfront()を呼ぶことはありません。std::string_view::substrは文字列をコピーせず位置と長さを持ち直すだけなので、再帰のたびに確保が発生することもありません。そしてconstexpr関数なので、この再帰はstatic_assertの中でコンパイラが実行し、実行時のコストはゼロです。これは参考実装であり、唯一の正解ではありません(両端から添字を寄せるループでも、もちろん同じ判定が書けます)。