Skip to content

London | Nadika Zavodovska | Module-Complexity | Sprint 2 | Improve with precomputing #23

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
from typing import List


def find_longest_common_prefix(strings: List[str]):
def find_longest_common_prefix(strings: List[str]) -> str:
"""
find_longest_common_prefix returns the longest string common at the start of any two strings in the passed list.

In the event that an empty list, a list containing one string, or a list of strings with no common prefixes is passed, the empty string will be returned.
"""
# If the list has less than 2 strings, we can return early (nothing to compare)
if len(strings) < 2:
return ""
#Sort strings to bring similar ones next to each other
# This helps to find common parts faster without checking every possible pair!
strings.sort()

longest = ""
for string_index, string in enumerate(strings):
for other_string in strings[string_index+1:]:
common = find_common_prefix(string, other_string)
if len(common) > len(longest):
longest = common

#instead of checking all pairs (that is slow), just check each pair of neighbors
for i in range(len(strings) - 1):
common = find_common_prefix(strings[i], strings[i + 1])
if len(common) > len(longest):
longest = common

return longest


Expand Down
17 changes: 14 additions & 3 deletions Sprint-2/improve_with_precomputing/count_letters/count_letters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,22 @@ def count_letters(s: str) -> int:
"""
count_letters returns the number of letters which only occur in upper case in the passed string.
"""
only_upper = set()
# Store all lowercase and uppercase letters from the string
# This helps to check faster later
lower_letters = set()
upper_letters = set()

# Go through the string once and fill the sets
for letter in s:
if is_upper_case(letter):
if letter.lower() not in s:
only_upper.add(letter)
upper_letters.add(letter)
else:
lower_letters.add(letter)

# Only keep uppercase letters that don't have lowercase versions
# Using sets makes this check much faster
only_upper = {letter for letter in upper_letters if letter.lower() not in lower_letters}

return len(only_upper)


Expand Down