startswith の開始位置引数
一言まとめ
途中位置からの前方一致は s[idx:].startswith(w) ではなく s.startswith(w, idx) と書けば中間文字列を作らずに済む。
文字列の途中から前方一致を見るとき、スライスして startswith に渡していました。
if s[idx:].startswith(w): idx += len(w)startswith は開始位置を第2引数で受け取ります。
if s.startswith(w, idx): idx += len(w)スライス版は毎回 s[idx:] の中間文字列を作ります。ループの中で長い文字列を後ろから削っていくような処理だと、この確保の分だけ遅くなります。第3引数に終了位置も渡せます。w が空でなければ s.startswith(w, idx, end) と s[idx:end].startswith(w) は一致します(空文字列のときだけ、idx > end で前者が False、後者が True になります)。endswith も同じ引数を取ります。
元ネタは AtCoder ABC049 C(白昼夢)で、末尾から候補語を剥がしていく解法です。
更新履歴
- 2026-06-21: 初版(memos から移行)
- 2026-10-09: タイトルを概念名に揃え、tags を補う