yesBài 3 đếm rồi greedy nhỉ![]()

Nhìn ko ra greedy rules my fence
chắc xử lí theo độ dài mỗi từ từ trên xuống dướiTừ từ rồi trải nghiệm, nay bài 3 nhìn ra patterns rồi mà lại nghĩ phức tạp quá ko tìm ra cách giải.bài 2 ngốn thời gian quá, sai vặt mà hoảng tìm mãi k ra chỗ sai. Lần đầu contest mà đc có 2 bài à
![]()

class Solution:
def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int:
ans = 0
n = len(nums)
m = len(pattern)
for i in range(n - m):
matches = True
for k in range(m):
if pattern[k] == 1 and nums[i + k + 1] > nums[i + k]:
continue
if pattern[k] == 0 and nums[i + k + 1] == nums[i + k]:
continue
if pattern[k] == -1 and nums[i + k + 1] < nums[i + k]:
continue
matches = False
break
if matches == True:
ans += 1
return ans
class Solution:
def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int:
ans = 0
def longest_prefix_suffix(pattern: str):
lps = [0] * len(pattern)
length = 0 # length of the previous longest prefix suffix
i = 1
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
return lps
def kmp_search(text: str, pattern: str):
nonlocal ans
if pattern == "":
return []
lps = longest_prefix_suffix(pattern)
i = 0 # index for text
j = 0 # index for pattern
result = []
while i < len(text):
if pattern[j] == text[i]:
i += 1
j += 1
if j == len(pattern):
ans += 1
j = lps[j - 1]
elif i < len(text) and pattern[j] != text[i]:
if j != 0:
j = lps[j - 1]
else:
i += 1
return ans
n = len(nums)
text = ""
for i in range(n - 1):
if(nums[i + 1] > nums[i]):
text+= "1"
if(nums[i + 1] == nums[i]):
text += "0"
if(nums[i + 1] < nums[i]):
text += "2"
patterns = ""
for i in pattern:
if i == 0:
patterns += "0"
if i == 1:
patterns += "1"
if i == -1:
patterns += "2"
return kmp_search(text, patterns)
sao bác ko dùng luôn array (không cần phải convert sang string) ấy, convert nums sang dạng {-1,0,1} giống pattern là đcTừ từ rồi trải nghiệm, nay bài 3 nhìn ra patterns rồi mà lại nghĩ phức tạp quá ko tìm ra cách giải.
May múc lại được bài 4
Bài 2 cứ làm brute force thôi fence
Python:class Solution: def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int: ans = 0 n = len(nums) m = len(pattern) for i in range(n - m): matches = True for k in range(m): if pattern[k] == 1 and nums[i + k + 1] > nums[i + k]: continue if pattern[k] == 0 and nums[i + k + 1] == nums[i + k]: continue if pattern[k] == -1 and nums[i + k + 1] < nums[i + k]: continue matches = False break if matches == True: ans += 1 return ans
Còn bài 4 thì xài KMP search, cơ mà copy paste cái KMP search vô cho nhanh nên phải convert từ number qua string coi như trick workaround haha
Python:class Solution: def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int: ans = 0 def longest_prefix_suffix(pattern: str): lps = [0] * len(pattern) length = 0 # length of the previous longest prefix suffix i = 1 while i < len(pattern): if pattern[i] == pattern[length]: length += 1 lps[i] = length i += 1 else: if length != 0: length = lps[length - 1] else: lps[i] = 0 i += 1 return lps def kmp_search(text: str, pattern: str): nonlocal ans if pattern == "": return [] lps = longest_prefix_suffix(pattern) i = 0 # index for text j = 0 # index for pattern result = [] while i < len(text): if pattern[j] == text[i]: i += 1 j += 1 if j == len(pattern): ans += 1 j = lps[j - 1] elif i < len(text) and pattern[j] != text[i]: if j != 0: j = lps[j - 1] else: i += 1 return ans n = len(nums) text = "" for i in range(n - 1): if(nums[i + 1] > nums[i]): text+= "1" if(nums[i + 1] == nums[i]): text += "0" if(nums[i + 1] < nums[i]): text += "2" patterns = "" for i in pattern: if i == 0: patterns += "0" if i == 1: patterns += "1" if i == -1: patterns += "2" return kmp_search(text, patterns)

Đúng rồi fence, lúc thi context mình cứ nghĩ phức tạp vấn đề lên ấy, convert qua string dính edge case sml mất luôn 2 lần submit saisao bác ko dùng luôn array (không cần phải convert sang string) ấy, convert nums sang dạng {-1,0,1} giống pattern là đc


class Solution:
def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int:
def longest_prefix_suffix(pattern: str):
lps = [0] * len(pattern)
length = 0 # length of the previous longest prefix suffix
i = 1
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
return lps
def kmp_search(text, pattern):
ans = 0
if pattern == "":
return []
lps = longest_prefix_suffix(pattern)
i = 0 # index for text
j = 0 # index for pattern
result = []
while i < len(text):
if pattern[j] == text[i]:
i += 1
j += 1
if j == len(pattern):
ans += 1
j = lps[j - 1]
elif i < len(text) and pattern[j] != text[i]:
if j != 0:
j = lps[j - 1]
else:
i += 1
return ans
n = len(nums)
formed_text = [0]*(n - 1)
for i in range(n - 1):
if(nums[i + 1] > nums[i]):
formed_text[i] = 1
if(nums[i + 1] == nums[i]):
formed_text[i] = 0
if(nums[i + 1] < nums[i]):
formed_text[i] = -1
return kmp_search(formed_text, pattern)
solution kmp sẵn là string, nên convert sang string cho nó cẩn thẩnsao bác ko dùng luôn array (không cần phải convert sang string) ấy, convert nums sang dạng {-1,0,1} giống pattern là đc

làm đi bác. Có 5 dòng thôiLam dc 3 cau, thay cau 4 Hard deo them lam nua![]()

that ahlàm đi bác. Có 5 dòng thôi![]()
nhầm, em đếm lại thì 6 dòng bácthat ah![]()
