startswith の開始位置引数

一言まとめ

途中位置からの前方一致は s[idx:].startswith(w) ではなく s.startswith(w, idx) と書けば中間文字列を作らずに済む。

作成 · 更新 · #python#string

文字列の途中から前方一致を見るとき、スライスして 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 を補う

同じトピック — Python