From 60dc98ff28a5f41db95ea2fcc210c0478f8fb68c Mon Sep 17 00:00:00 2001 From: TarasMykytiuk Date: Sun, 28 Jun 2026 01:25:12 +0100 Subject: [PATCH 1/4] common prefix --- .../common_prefix/common_prefix.py | 12 +++++++----- 1 file changed, 7 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 f4839e7..a24c3cb 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,14 @@ 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) <= 1: + return "" + strings.sort(reverse = True) 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 index in range(len(strings) -1): + common = find_common_prefix(strings[index], strings[index+1]) + if len(common) > len(longest): + longest = common return longest From 0fbc039cbf7d4bce01b3a0ce327c46872d298224 Mon Sep 17 00:00:00 2001 From: TarasMykytiuk Date: Sun, 28 Jun 2026 01:36:21 +0100 Subject: [PATCH 2/4] count letters --- .../count_letters/count_letters.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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 62c3ec0..74be8f6 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -2,12 +2,15 @@ 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() + appeared_upper = set() + appeared_lower = set() for letter in s: - if is_upper_case(letter): - if letter.lower() not in s: - only_upper.add(letter) - return len(only_upper) + if letter.islower(): + appeared_lower.add(letter.lower()) + else: + appeared_upper.add(letter.lower()) + + return len(appeared_upper.difference(appeared_lower)) def is_upper_case(letter: str) -> bool: From 776a4b3376771fe71b3831035783196f49a7f11a Mon Sep 17 00:00:00 2001 From: TarasMykytiuk Date: Mon, 29 Jun 2026 00:08:37 +0100 Subject: [PATCH 3/4] feedback fix 2 --- .../improve_with_precomputing/count_letters/count_letters.py | 2 ++ .../count_letters/count_letters_test.py | 3 +++ 2 files changed, 5 insertions(+) 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 74be8f6..2700e81 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -5,6 +5,8 @@ def count_letters(s: str) -> int: appeared_upper = set() appeared_lower = set() for letter in s: + if not letter.isalpha(): + continue if letter.islower(): appeared_lower.add(letter.lower()) else: diff --git a/Sprint-2/improve_with_precomputing/count_letters/count_letters_test.py b/Sprint-2/improve_with_precomputing/count_letters/count_letters_test.py index fe88477..756d455 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters_test.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters_test.py @@ -16,6 +16,9 @@ def test_both(self): def test_mixed(self): self.assertEqual(count_letters("aABCbcDEeFGhI"), 4) + + def test_non_alphabet(self): + self.assertEqual(count_letters("aABCbcDEeFGhI!!!"), 4) def test_long_string(self): s = "" From 736e8f0e0b72345bc0d45407490066fa1765dab1 Mon Sep 17 00:00:00 2001 From: TarasMykytiuk Date: Tue, 30 Jun 2026 03:42:32 +0100 Subject: [PATCH 4/4] added comments on complexity --- .../improve_with_precomputing/common_prefix/common_prefix.py | 4 ++++ .../improve_with_precomputing/count_letters/count_letters.py | 4 ++++ 2 files changed, 8 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 a24c3cb..5eb82f5 100644 --- a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py +++ b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py @@ -6,6 +6,10 @@ 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. + + Before changes: O(N^2 * avg(string_length)) - each string compared with each other string in double loop. + After changes: O(N * logN * avg(string_length)) + """ if len(strings) <= 1: return "" 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 2700e81..4e114ee 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -1,6 +1,10 @@ def count_letters(s: str) -> int: """ count_letters returns the number of letters which only occur in upper case in the passed string. + + Before changes: O(N^2) - each letter compared with each other in double loop. + After changes: O(N + min(len(set_upper), min(len(set_lower))) + """ appeared_upper = set() appeared_lower = set()