1
0

「文字列収集」(ランク S) を解いてみた (startswith() を使う)

Last updated at Posted at 2024-08-25

はじめに

paiza x Qiita のプログラミング問題文字列収集 について, re.match() を使って解きました.

でも, 一部の問題に秒単位の実行時間がかかっていました. そこでちょっと調べたところ, startswith() でも文字列の一致の判定ができることに気付いたので, プログラムを修正してみました.

コード

文字列の一致の判定で, 前回は re.match() を使っていました. コードは以下の通りです.

2-1
def check_match(s_list, query):
    """文字列のリスト (s_list) とクエリー (query) を受け取り, マッチしたリストのインデックスを返す
    """
    match_list = list(map(lambda x: re.match(query, x), s_list)) # マッチしたかしないかのリストを返す
    return [i for i, x in enumerate(match_list) if x != None] # マッチしたリストのインデックスを返す

この関数を, startswith() を使って書き換えます. startswith()TrueFalse を返すので, return の内包表記も書き換えてます.

2-1'
def check_match(s_list, query):
    """文字列のリスト (s_list) とクエリー (query) を受け取り, マッチしたリストのインデックスを返す
    """
    match_list = list(map(lambda x: x.startswith(query), s_list)) # マッチしたかしないかのリストを返す
    return [i for i, x in enumerate(match_list) if x == True] # マッチしたリストのインデックスを返す

実行時間比較

文字列の一致判定による実行時間の違いは, 次の通りでした (単位 ; 秒). startswith() のほうが早いですね.

テスト番号 re.match() startswith()
1 0.04 0.03
2 0.03 0.02
3 0.24 0.09
4 0.06 0.04
5 0.16 0.06
6 0.32 0.11
7-1 0.09 0.04
7-2 0.08 0.04
8 0.26 0.09
9 1.49 0.45
10 1.58 0.49

さいごに

「文字列の一致は正規表現だろう」と思ってましたが startswith()endswith(), また含まれるかどうかは in で分かります. 適材適所が大事ですね.

リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0