From 25951c03bd680f1a68115dcaa723d6ce9593a491 Mon Sep 17 00:00:00 2001 From: Fithi Teklom Date: Tue, 20 Oct 2026 22:08:21 +0100 Subject: [PATCH 1/3] Optimize longest common prefix search by sorting strings --- .../common_prefix/common_prefix.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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..48a26536 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 From f040003dfe6bcddb58ee4603e3f617e162f72eed Mon Sep 17 00:00:00 2001 From: Fithi Teklom Date: Tue, 20 Oct 2026 22:31:07 +0100 Subject: [PATCH 2/3] Improve count_letters.py with precomputing --- .../improve_with_precomputing/count_letters/count_letters.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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..d564419c 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -2,10 +2,11 @@ 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) From 506c094423cec7aa130fde8dbe1e46cf0d73a98a Mon Sep 17 00:00:00 2001 From: Fithi Teklom Date: Wed, 21 Oct 2026 15:58:06 +0100 Subject: [PATCH 3/3] Explain the complexity for the new improvement with precomputing. --- .../improve_with_precomputing/common_prefix/common_prefix.py | 4 ++++ .../improve_with_precomputing/count_letters/count_letters.py | 5 +++++ 2 files changed, 9 insertions(+) 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 48a26536..82a5b76b 100644 --- a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py +++ b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py @@ -26,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 d564419c..60d18b9d 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -13,3 +13,8 @@ def count_letters(s: str) -> int: 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.