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
答案 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 algorithm
,z algorithm
,kmpalgorithm
全部以O(n+m)
的运行时复杂度运行,其中n是字符串长度,m是模式长度。您的算法以O(n*m)
运行时复杂度运行。我建议开始学习rabin karp算法,我个人认为最容易掌握。
还有一些高级主题,例如在一个字符串中搜索许多模式,例如aho-corasick算法,这很容易阅读。我认为这是grep
在搜索多个模式时使用的方法。
希望对您有所帮助:)