From af12f1ce1467ad63027c7b2aed2fb2002e163988 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sun, 21 Apr 2024 14:35:35 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90Arai60=E3=80=9157=E5=95=8F?= =?UTF-8?q?=E7=9B=AE=20392.=20Is=20Subsequence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../57_392_Is Subsequence/level_1.py | 14 +++++++++ .../57_392_Is Subsequence/level_2.py | 30 +++++++++++++++++++ .../57_392_Is Subsequence/level_3.py | 9 ++++++ 3 files changed, 53 insertions(+) create mode 100644 arai60/54-60_others/57_392_Is Subsequence/level_1.py create mode 100644 arai60/54-60_others/57_392_Is Subsequence/level_2.py create mode 100644 arai60/54-60_others/57_392_Is Subsequence/level_3.py diff --git a/arai60/54-60_others/57_392_Is Subsequence/level_1.py b/arai60/54-60_others/57_392_Is Subsequence/level_1.py new file mode 100644 index 0000000..0aca2e9 --- /dev/null +++ b/arai60/54-60_others/57_392_Is Subsequence/level_1.py @@ -0,0 +1,14 @@ +# ポインタを2つ用意して、同じ文字ならsを次に進める +# sが最後まで進めばSubsequenceが存在する +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + t_index = 0 + for s_index in range(len(s)): + if len(t) <= t_index: + return False + while t[t_index] != s[s_index]: + t_index += 1 + if len(t) == t_index: + return False + t_index += 1 + return True diff --git a/arai60/54-60_others/57_392_Is Subsequence/level_2.py b/arai60/54-60_others/57_392_Is Subsequence/level_2.py new file mode 100644 index 0000000..be42c39 --- /dev/null +++ b/arai60/54-60_others/57_392_Is Subsequence/level_2.py @@ -0,0 +1,30 @@ +# ポインタを2つ用意して、同じ文字ならsを次に進める +# while文で記載 +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + t_index = 0 + s_index = 0 + while s_index < len(s) and t_index < len(t): + if s[s_index] == t[t_index]: + s_index += 1 + t_index += 1 + return s_index == len(s) + + +# DPで最長共通部分列問題を解く +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + # longest_common_nums[i][j]はs[:i]とt[:j]の最長共通部分列の長さ + longest_common_nums = [[0] * (len(t) + 1) for _ in range(len(s) + 1)] + for i in range(len(s)): + for j in range(len(t)): + if s[i] == t[j]: + longest_common_nums[i + 1][j + 1] = ( + longest_common_nums[i][j] + 1 + ) + continue + longest_common_nums[i + 1][j + 1] = max( + longest_common_nums[i + 1][j], + longest_common_nums[i][j + 1], + ) + return longest_common_nums[-1][-1] == len(s) diff --git a/arai60/54-60_others/57_392_Is Subsequence/level_3.py b/arai60/54-60_others/57_392_Is Subsequence/level_3.py new file mode 100644 index 0000000..d9a14f6 --- /dev/null +++ b/arai60/54-60_others/57_392_Is Subsequence/level_3.py @@ -0,0 +1,9 @@ +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + s_index = 0 + t_index = 0 + while s_index < len(s) and t_index < len(t): + if s[s_index] == t[t_index]: + s_index += 1 + t_index += 1 + return s_index == len(s) From ef9b0cb6c4fc28917f5fbb55889a8cab0151210d Mon Sep 17 00:00:00 2001 From: shining-ai Date: Mon, 22 Apr 2024 09:12:40 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E6=AD=A3=E8=A6=8F=E8=A1=A8=E7=8F=BE?= =?UTF-8?q?=E3=81=AE=E5=9B=9E=E7=AD=94=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../57_392_Is Subsequence/level_4.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 arai60/54-60_others/57_392_Is Subsequence/level_4.py diff --git a/arai60/54-60_others/57_392_Is Subsequence/level_4.py b/arai60/54-60_others/57_392_Is Subsequence/level_4.py new file mode 100644 index 0000000..158c974 --- /dev/null +++ b/arai60/54-60_others/57_392_Is Subsequence/level_4.py @@ -0,0 +1,22 @@ +# ポインタを2つ用意して、同じ文字ならsを次に進める +# sが最後まで進めばSubsequenceが存在する +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + t_index = 0 + for s_index in range(len(s)): + for t_index in range(t_index, len(t)): + if t[t_index] == s[s_index]: + t_index += 1 + break + else: + return False + return True + + +# 正規表現 +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + pattern = "" + for c in s: + pattern += ".*" + c + return re.match(pattern, t) != None