mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Compare commits
14 Commits
e2fa79969a
...
3791e1954a
Author | SHA1 | Date | |
---|---|---|---|
|
3791e1954a | ||
|
f3f32ae3ca | ||
|
e3bd7721c8 | ||
|
e3f3d668be | ||
|
d448a4e7e5 | ||
|
0ceeb2ccec | ||
|
43993fb763 | ||
|
85fcd387cc | ||
|
deb7f89291 | ||
|
d11acec5f3 | ||
|
c64f65f6f0 | ||
|
3418c8031f | ||
|
7fc42c79f0 | ||
|
00b17c4c7c |
|
@ -16,7 +16,7 @@ repos:
|
||||||
- id: auto-walrus
|
- id: auto-walrus
|
||||||
|
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.7.2
|
rev: v0.7.4
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
- id: ruff-format
|
- id: ruff-format
|
||||||
|
@ -42,7 +42,7 @@ repos:
|
||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
|
|
||||||
- repo: https://github.com/abravalheri/validate-pyproject
|
- repo: https://github.com/abravalheri/validate-pyproject
|
||||||
rev: v0.22
|
rev: v0.23
|
||||||
hooks:
|
hooks:
|
||||||
- id: validate-pyproject
|
- id: validate-pyproject
|
||||||
|
|
||||||
|
|
|
@ -172,7 +172,7 @@ def solved(values):
|
||||||
|
|
||||||
def from_file(filename, sep="\n"):
|
def from_file(filename, sep="\n"):
|
||||||
"Parse a file into a list of strings, separated by sep."
|
"Parse a file into a list of strings, separated by sep."
|
||||||
return open(filename).read().strip().split(sep) # noqa: SIM115
|
return open(filename).read().strip().split(sep)
|
||||||
|
|
||||||
|
|
||||||
def random_puzzle(assignments=17):
|
def random_puzzle(assignments=17):
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python3
|
#!python
|
||||||
import os
|
import os
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
89
strings/min_window_substring.py
Normal file
89
strings/min_window_substring.py
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
def min_window(search_str: str, target_letters: str) -> str:
|
||||||
|
"""
|
||||||
|
Given a string to search, and another string of target char_dict,
|
||||||
|
return the smallest substring of the search string that contains
|
||||||
|
all target char_dict.
|
||||||
|
|
||||||
|
This is somewhat modified from my solution to the problem
|
||||||
|
"Minimum Window Substring" on leetcode.
|
||||||
|
https://leetcode.com/problems/minimum-window-substring/description/
|
||||||
|
|
||||||
|
>>> min_window("Hello World", "lWl")
|
||||||
|
'llo W'
|
||||||
|
>>> min_window("Hello World", "f")
|
||||||
|
''
|
||||||
|
|
||||||
|
This solution uses a sliding window, alternating between shifting
|
||||||
|
the end of the window right until all target char_dict are contained
|
||||||
|
in the window, and shifting the start of the window right until the
|
||||||
|
window no longer contains every target character.
|
||||||
|
|
||||||
|
Time complexity: O(target_count + search_len) ->
|
||||||
|
The algorithm checks a dictionary at most twice for each character
|
||||||
|
in search_str.
|
||||||
|
|
||||||
|
Space complexity: O(search_len) ->
|
||||||
|
The primary contributor to additional space is the building of a
|
||||||
|
dictionary using the search string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
target_count = len(target_letters)
|
||||||
|
search_len = len(search_str)
|
||||||
|
|
||||||
|
# Return if not possible due to string lengths.
|
||||||
|
if search_len < target_count:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
# Build dictionary with counts for each letter in target_letters
|
||||||
|
char_dict = {}
|
||||||
|
for ch in target_letters:
|
||||||
|
if ch not in char_dict:
|
||||||
|
char_dict[ch] = 1
|
||||||
|
else:
|
||||||
|
char_dict[ch] += 1
|
||||||
|
|
||||||
|
# Initialize window
|
||||||
|
window_start = 0
|
||||||
|
window_end = 0
|
||||||
|
|
||||||
|
exists = False
|
||||||
|
min_window_len = search_len + 1
|
||||||
|
|
||||||
|
# Start sliding window algorithm
|
||||||
|
while window_end < search_len:
|
||||||
|
# Slide window end right until all search characters are contained
|
||||||
|
while target_count > 0 and window_end < search_len:
|
||||||
|
cur = search_str[window_end]
|
||||||
|
if cur in char_dict:
|
||||||
|
char_dict[cur] -= 1
|
||||||
|
if char_dict[cur] >= 0:
|
||||||
|
target_count -= 1
|
||||||
|
window_end += 1
|
||||||
|
temp = window_end - window_start
|
||||||
|
|
||||||
|
# Check if window is the smallest found so far
|
||||||
|
if target_count == 0 and temp < min_window_len:
|
||||||
|
min_window = [window_start, window_end]
|
||||||
|
exists = True
|
||||||
|
min_window_len = temp
|
||||||
|
|
||||||
|
# Slide window start right until a search character exits the window
|
||||||
|
while target_count == 0 and window_start < window_end:
|
||||||
|
cur = search_str[window_start]
|
||||||
|
window_start += 1
|
||||||
|
if cur in char_dict:
|
||||||
|
char_dict[cur] += 1
|
||||||
|
if char_dict[cur] > 0:
|
||||||
|
break
|
||||||
|
temp = window_end - window_start + 1
|
||||||
|
|
||||||
|
# Check if window is the smallest found so far
|
||||||
|
if temp < min_window_len and target_count == 0:
|
||||||
|
min_window = [window_start - 1, window_end]
|
||||||
|
min_window_len = temp
|
||||||
|
target_count = 1
|
||||||
|
|
||||||
|
if exists:
|
||||||
|
return search_str[min_window[0] : min_window[1]]
|
||||||
|
else:
|
||||||
|
return ""
|
Loading…
Reference in New Issue
Block a user