From 47c73eced74227d613de5f7adae30924b2fed9c1 Mon Sep 17 00:00:00 2001 From: Mikiyas-STP Date: Wed, 15 Oct 2025 20:04:38 +0100 Subject: [PATCH 1/3] common prefix using precomputing --- .../common_prefix/common_prefix.py | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 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..797a8cd 100644 --- a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py +++ b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py @@ -1,24 +1,18 @@ from typing import List +def find_longest_common_prefix(strings: List[str]) -> str: + if len(strings) < 2: + return "" -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. - """ - 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 - return longest - - -def find_common_prefix(left: str, right: str) -> str: - min_length = min(len(left), len(right)) - for i in range(min_length): - if left[i] != right[i]: - return left[:i] - return left[:min_length] + # Find the shortest string: limit for prefix + min_len = min(len(s) for s in strings) + if min_len == 0: + return "" + # Compare character by character across all strings + for i in range(min_len): + char_set = set(s[i] for s in strings) + if len(char_set) > 1: # mismatch found + return strings[0][:i] + return strings[0][:min_len] +#Originally Compares every pair O(n² * m) +#now compare column wise across all strings O(n * m) \ No newline at end of file From 227994c7cfac523f06b91413c1483d98b5c1e53f Mon Sep 17 00:00:00 2001 From: Mikiyas-STP Date: Wed, 15 Oct 2025 20:06:20 +0100 Subject: [PATCH 2/3] none changed --- .../common_prefix/common_prefix.py | 8 +++----- 1 file changed, 3 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 797a8cd..297fa36 100644 --- a/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py +++ b/Sprint-2/improve_with_precomputing/common_prefix/common_prefix.py @@ -1,17 +1,15 @@ from typing import List - def find_longest_common_prefix(strings: List[str]) -> str: if len(strings) < 2: return "" - - # Find the shortest string: limit for prefix + #Find shortest string limit for prefix min_len = min(len(s) for s in strings) if min_len == 0: return "" - # Compare character by character across all strings + #Compare character by character across all strings for i in range(min_len): char_set = set(s[i] for s in strings) - if len(char_set) > 1: # mismatch found + if len(char_set) > 1: #mismatch found return strings[0][:i] return strings[0][:min_len] #Originally Compares every pair O(n² * m) From d23ef90c6dd9e88558ac737a1048b6aea671569b Mon Sep 17 00:00:00 2001 From: Mikiyas-STP Date: Wed, 15 Oct 2025 20:14:08 +0100 Subject: [PATCH 3/3] count letters using precomputing --- .../count_letters/count_letters.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 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..e67b1e7 100644 --- a/Sprint-2/improve_with_precomputing/count_letters/count_letters.py +++ b/Sprint-2/improve_with_precomputing/count_letters/count_letters.py @@ -1,14 +1,15 @@ +from collections import Counter 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() - for letter in s: - if is_upper_case(letter): - if letter.lower() not in s: - only_upper.add(letter) - return len(only_upper) - - -def is_upper_case(letter: str) -> bool: - return letter == letter.upper() + #Returns the number of letters which only occur in uppercase in the passed string + letters = Counter(s) #count occurrences of each character + only_upper = 0 + for letter in letters: + if letter.isupper(): + if letter.lower() not in letters: + only_upper += 1 + return only_upper +#The first implementation was O(n² * m) in the worst case comparing every pair of strings character by character. +# Now, +#Counter scans the string once O(n) +#Checking letter.lower() in letters O(1) per letter +#Total time O(n + u) where u is the number of unique letters \ No newline at end of file