diff --git a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py index f4839e70..82a5b76b 100644 --- a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py +++ b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py @@ -7,12 +7,16 @@ def find_longest_common_prefix(strings: List[str]): 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 "" + + sorted_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(sorted_strings) - 1): + common = find_common_prefix(sorted_strings[i], sorted_strings[i + 1]) + if len(common) > len(longest): + longest = common return longest @@ -22,3 +26,7 @@ def find_common_prefix(left: str, right: str) -> str: if left[i] != right[i]: return left[:i] return left[:min_length] + +# The original code compares every pair of strings, giving it (O(m^2)) pair comparisons. +# The new version sorts the strings and compares only neighbouring pairs, reducing the number of comparisons. +# Its approximate time complexity improves from (O(m^2L)) to (O(mL\log m)). \ No newline at end of file diff --git a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py index 62c3ec07..60d18b9d 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -2,13 +2,19 @@ def count_letters(s: str) -> int: """ count_letters returns the number of letters which only occur in upper case in the passed string. """ + lowercase_letters = {letter for letter in s if letter.islower()} only_upper = set() for letter in s: if is_upper_case(letter): - if letter.lower() not in s: + if letter.lower() not in lowercase_letters: only_upper.add(letter) return len(only_upper) def is_upper_case(letter: str) -> bool: return letter == letter.upper() + +# +# The original code searches the string repeatedly, giving it (O(n^2)) time complexity. +# The new version stores lowercase letters in a set first, so it can check them faster. +# This reduces the expected time complexity to (O(n)), but uses extra memory.