Created
April 1, 2019 15:59
-
-
Save lopespm/9790d60492aff25ea0960fe9ed389c0f to your computer and use it in GitHub Desktop.
Test if prefix is present in an array of sorted strings problem (Python)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# (Variant #4 for exercise 11.1 on EPI (Elements of Programming Interviews)) | |
# The rationale behind it to perform a binary search which only considers a given character index of the strings. | |
# If these are present, continue to the next character index. If any of the prefix characters cannot be found in any string, return immediatly | |
# Considering n strings and k prefix length: | |
# Time complexity: O(k * log(n)) | |
# Space complexity: O(1) | |
from typing import List | |
def first(items: List[str], prefix: str, i: int, c: str, left: int, right: int): | |
result = -1 | |
while left <= right: | |
mid = left + ((right - left) // 2) | |
if ( i >= len(items[mid]) ): | |
left = mid + 1 | |
elif (c < items[mid][i]): | |
right = mid - 1 | |
elif (c > items[mid][i]): | |
left = mid + 1 | |
else: | |
result = mid | |
right = mid - 1 | |
return result | |
def last(items: List[str], prefix: str, i: int, c: str, left: int, right: int): | |
result = -1 | |
while left <= right: | |
mid = left + ((right - left) // 2) | |
if ( i >= len(items[mid]) ): | |
left = mid + 1 | |
elif (c < items[mid][i]): | |
right = mid - 1 | |
elif (c > items[mid][i]): | |
left = mid + 1 | |
else: | |
result = mid | |
left = mid + 1 | |
return result | |
def is_prefix(items: List[str], prefix: str): | |
left = 0 | |
right = len(items) - 1 | |
for i in range(len(prefix)): | |
c = prefix[i] | |
left = first(items, prefix, i, c, left, right) | |
right = last(items, prefix, i, c, left, right) | |
if (left == -1 or right == -1): | |
return False | |
return True | |
# Test cases | |
a = ['ab', 'abjsiohjd', 'abikshdiu', 'ashdi','abcde Aasioudhf', 'abcdefgOAJ', 'aa', 'aaap', 'aas', 'asd', 'bbbbb', 'bsadiojh', 'iod', '0asdn', 'asdjd', 'bqw', 'ba'] | |
a.sort() | |
print(a) | |
print(is_prefix(a, 'abcdf')) | |
print(is_prefix(a, 'abcde')) | |
print(is_prefix(a, 'abcdef')) | |
print(is_prefix(a, 'abcdefg')) | |
print(is_prefix(a, 'abcdefgh')) | |
print(is_prefix(a, 'abcde Aa')) | |
print(is_prefix(a, 'iod')) | |
print(is_prefix(a, 'ZZZZZZiod')) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment