前提
ここに質問の内容を詳しく書いてください。
(例)
pythonでメソッド s.find(t) と同じ動作をする関数 my_find(s, t) を実装したいです。
my_find(s,t)ではfor文と文字列 s に対し,s.startswith(t, i) は,s の i 番目の文字から始まる部分文字列が t と一致するとき True, そうでないとき False を返す関数を使って実行したいです。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
文字列 s に対し、s が部分文字列として t を含むならば,その最初の出現位置を返し、s が部分文字列として t を含まないならば,-1 を返す関数をfindメソッドを使わずに作りたいです。(新しく作りたい関数をmy_find(s,t)とします。)
また、s.startswith(t, i) と同じ動作をする関数 my_startswith(s, t, i)を自分で作ったのでmy_startswith(s,t,i)とfor文を、関数my_find(s,t)の中で使いたいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
文字列 s に対し、s の i 番目の文字から始まる部分文字列が t と一致するとき True, そうでないとき False を返すs.startswith(t, i) と同じ動作をするものをまず作りました。
def my_startswith(s, t, i): # t[0], t[1], ..., t[len(t)-1] が # s[i], s[i+1], ..., s[i+len(t)-1] と # 同じかどうか調べる for j in range(0, len(t)): if len(s)-i < len(t): return False if s[i + j] != t[j]: # 異なる文字があった return False return True
上の関数を使って、文字列 s に対し、s が部分文字列として t を含むならば,その最初の出現位置を返し、s が部分文字列として t を含まないならば,-1 を返すmy_find(s,t)を作成しようとしました。
# 入力: # s : 文字列 # t : 文字列 # 出力: # s が t を含むならその最初の出現位置 # それ以外のとき -1 def my_find(s, t): for i in range(0,len(s)): if my_startswith(s,t,i)==True: return i if len(s)-i < len(t): return i else: return -1
しかし上のコードだと
s = "abracadabra"
my_find(s, "cad")
を実行したときに正しい出力は4なのに-と表示されてしまいます。
iの範囲が間違っていると思い範囲を色々変えてみたのですがうまくいきません。
分かりにくい説明で申し訳ないのですが、ご教授ください。
試したこと
上のコードを作り実行してみました。
補足情報(FW/ツールのバージョンなど)
my_find(s, t) は,my_startswith(s, t, i) が True になる
最小の i を return すればよい
for i in range(....): # range の引数がよく分かりませんでした
もし my_startswith(s, t, i) が成り立てば
return i
return -1 # ループ中いちども my_startswith(s, t, i) が True にならなかった場合
このように考えています。よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー