Skip to content
Open
29 changes: 20 additions & 9 deletions Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@


def find_longest_common_prefix(strings: List[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 len(strings) < 2:
return ""

strings = sorted(strings)

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
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 All @@ -22,3 +22,14 @@ def find_common_prefix(left: str, right: str) -> str:
if left[i] != right[i]:
return left[:i]
return left[:min_length]


"""
The new implementation sorts a string first, then compares each string
with the one that comes after it. On the other hand, the original imple-
mentation compares each string with every single while looping through
nested for loop.
As a result, the compelxity time drops from the original O(n^2 * m) to
around O(n log n * m).
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

n log n * m could be easily misinterpreted as n log (n * m). You probably mean m * n log n.


"""
21 changes: 17 additions & 4 deletions Sprint-2/improve_with_precomputing/count_letters/count_letters.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
def count_letters(s: str) -> int:
"""
count_letters returns the number of letters which only occur in upper case in the passed string.
"""
only_lower = set()
for letter in s:
if letter.islower():
only_lower.add(letter)

only_upper = set()
for letter in s:
if is_upper_case(letter):
if letter.lower() not in s:
if letter.lower() not in only_lower:
only_upper.add(letter)
return len(only_upper)


def is_upper_case(letter: str) -> bool:
return letter == letter.upper()



"""
The old implementation scans through the entire string for every uppercase letter
we check against, therefore complexity in the worst case is O(n^2). However, in the
new implementation the lowercase letters a store beforehand in a set. This allows
checking against every uppercase letter without scanning through the entire string.
As a result, the complexixty time goes down to O(n) with the new implementation.

"""