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..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,24 +1,16 @@ from typing import List - - -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] +def find_longest_common_prefix(strings: List[str]) -> str: + if len(strings) < 2: + return "" + #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 + 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 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