确定字符串是否包含在python中的另一个字符串中

时间:2015-10-14 00:59:09

标签: python python-2.7

我希望确定字符串是否完全包含在其他字符串列表的开头。例如,如果我有字符串cde和字符串列表:

  ['ab', 'bce', 'cdef']

然后确定在cde

的开头包含cdef

我也希望反过来 - 即如果我有一个术语abc来识别上面列表中包含的ab

现在很明显,使用for循环进行设置是很简单的,使用函数startswith检查每个实例,但是这不可扩展,需要检查的可能性非常大。

虽然检查每个实例都是O(n)[因此如果你有100,000个可能性就很慢],我正在寻找一种检查O(1)的方法......感觉好像是"列表& #34;是预先排序的,然后可以简单地提取最接近的匹配,但不确定如何。

澄清:

  • 我只看字符串开头的完美匹配(即整个搜索字词都包含在内)。
  • 我将查找多个搜索字词(因此,虽然最初对数据进行排序可能不会很快,但沉没成本会节省后续的外观)。
  • 理想情况下会返回所有可能的匹配项(即如果cdefcdefg在列表中的位置,并查找cde,则会返回两者。)
  • 我使用术语" list"松散地,如同一系列术语一样。

1 个答案:

答案 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')