我希望确定字符串是否完全包含在其他字符串列表的开头。例如,如果我有字符串cde
和字符串列表:
['ab', 'bce', 'cdef']
然后确定在cde
cdef
我也希望反过来 - 即如果我有一个术语abc
来识别上面列表中包含的ab
。
现在很明显,使用for循环进行设置是很简单的,使用函数startswith
检查每个实例,但是这不可扩展,需要检查的可能性非常大。
虽然检查每个实例都是O(n)[因此如果你有100,000个可能性就很慢],我正在寻找一种检查O(1)的方法......感觉好像是"列表& #34;是预先排序的,然后可以简单地提取最接近的匹配,但不确定如何。
澄清:
cdef
和cdefg
在列表中的位置,并查找cde
,则会返回两者。)答案 0 :(得分:0)
在 O(1)中是不可能的,因为根据定义你必须遍历整个数组。如果数组已排序,那么您可以对字符串进行二进制搜索,然后检查该位置的元素是否以字符串开头。该操作是 O(log n)。
import bisect
# return the index of the string starting with the prefix
# or None if no such string is in the list
def search(a, prefix):
i = bisect.bisect_left(a, prefix)
isAtStart = (i < len(a) and a[i].startswith(prefix))
return i if isAtStart else None
search(['ab', 'bce', 'cdef'], 'bc')