从给定的str

时间:2019-04-22 04:20:32

标签: python algorithm

Google或Amazone在采访中问以下问题,我的解决方案会被接受吗?

问题::从给定的字符串中找到给定单词首次出现的索引

注意:上面的问题来自一个网站,以下代码通过了所有测试用例。但是,我不确定这是否是最佳解决方案,因此是否会被大型巨头接受。

def strStr(A, B):
    if len(A) == 0 or len(B) == 0:
        return -1
    for i in range(len(A)):
        c = A[i:i+len(B)]
        if c == B:
            return i
    else:
        return -1

6 个答案:

答案 0 :(得分:0)

Python实际上为此提供了一个内置函数,这就是为什么这个问题似乎不太适合使用python进行采访。这样的东西就足够了:

def strStr(A, B):
  return A.find(B)

否则,正如评论者提到的那样,输入/输出和测试很重要。您可以添加一些使其性能更高的检查(例如,检查B是否小于A),但我认为通常情况下,您的性​​能不会比O(n)好。

答案 1 :(得分:0)

如果要将整个单词与字符串中的单词匹配,则您的代码将无效。
例如,如果我的参数为print(strStr('world hello world', 'wor')),则您的代码将返回0,但应返回-1。

答案 2 :(得分:0)

我检查了您的功能,在python3.6中效果很好

print(strStr('abcdef', 'bcd')) # with your function.    *index start from 0
print("adbcdef".find('bcd')) # python default function. *index start from 1

答案 3 :(得分:0)

首次出现的索引,使用index()find()

text = 'hello i am homer simpson'

index = text.index('homer')
print(index)

index = text.find('homer')
print(index)

output:
11
11

答案 4 :(得分:0)

最好使用内置的python函数。 但是有时在面试中,他们会要求您自己实施。最好的办法是从最简单的版本开始,然后考虑极端情况和改进。

这里有一个针对您的版本的测试,该测试稍作改进,避免在每个索引和python内置版本中重新分配新字符串:

A = "aaa foo baz fooz bar aaa"
B = "bar"

def strInStr1(A, B):
    if len(A) == 0 or len(B) == 0:
        return -1
    for i in range(len(A)):
        c = A[i:i+len(B)]
        if c == B:
            return i
    else:
        return -1

def strInStr2(A, B):
  size = len(B)
  for i in range(len(A)):
    if A[i] == B[0]:
      if A[i:i+size] == B:
        return i
  return -1


def strInStr3(A, B):
  return A.index(B)


import timeit
setup = '''from __main__ import strInStr1, strInStr2, strInStr3, A, B'''
for f in  ("strInStr1", "strInStr2", "strInStr3"):
  result =  timeit.timeit(f"{f}(A, B)", setup=setup)
  print(f"{f}: ", result)

结果说明一切(以秒为单位的时间):

strInStr1:  15.809420814999612
strInStr2:  7.687011377005547
strInStr3:  0.8342400040055509

这里有live version

答案 5 :(得分:0)

您可以在该主题上学习一些算法,例如

rabin karp algorithmz algorithmkmpalgorithm

全部以O(n+m)的运行时复杂度运行,其中n是字符串长度,m是模式长度。您的算法以O(n*m)运行时复杂度运行。我建议开始学习rabin karp算法,我个人认为最容易掌握。

还有一些高级主题,例如在一个字符串中搜索许多模式,例如aho-corasick算法,这很容易阅读。我认为这是grep在搜索多个模式时使用的方法。 希望对您有所帮助:)