如何在不使用Python中的str.find()
的情况下在字符串中找到子字符串的位置?我应该如何循环呢?
def find substring(string,substring):
for i in xrange(len(string)):
if string[i]==substring[0]:
print i
else: print false
例如,当string = "ATACGTG"
和substring = "ACGT"
时,它应该返回2
。我想了解str.find()
的工作原理
答案 0 :(得分:1)
您可以使用Boyer-Moore或Knuth-Morris-Pratt。两者都创建表格以预先计算每次未命中的更快移动。 B-M页面有一个python实现。两个页面都引用其他字符串搜索算法。
答案 1 :(得分:0)
在不使用find
的约束下,您可以改为使用str.index
,如果找不到子字符串,则返回ValueError:
def find_substring(a_string, substring):
try:
print(a_string.index(substring))
except ValueError:
print('Not Found')
和用法:
>>> find_substring('foo bar baz', 'bar')
4
>>> find_substring('foo bar baz', 'quux')
Not Found
如果你必须循环,你可以这样做,沿着字符串滑动,并使用匹配的第一个字符,然后检查字符串的其余部分是否以子字符串开头,这是一个匹配:
def find_substring(a_string, substring):
for i, c in enumerate(a_string):
if c == substring[0] and a_string[i:].startswith(substring):
print(i)
return
else:
print(False)
没有字符串方法:
def find_substring(a_string, substring):
for i in range(len(a_string)):
if a_string[i] == substring[0] and a_string[i:i+len(substring)] == substring:
print(i)
return
else:
print(False)
在没有任何内置功能的情况下,我无法想办法。
答案 2 :(得分:0)
在没有任何内置功能的情况下,我想不出办法。
我可以:
def find_substring(string, substring):
def starts_with(string, substring):
while True:
if substring == '':
return True
if string == '' or string[0] != substring[0]:
return False
string, substring = string[1:], substring[1:]
n = 0
while string != '' and substring != '':
if starts_with(string, substring):
return n
string = string[1:]
n += 1
return -1
print(find_substring('ATACGTG', 'ACGT'))
即。避免使用内置len()
,range()
等。如果不使用内置len()
,我们就会失去一些效率,因为我们可以更快完成。 OP指定的迭代,上面使用,但递归变量更紧凑:
def find_substring(string, substring, n=0):
def starts_with(string, substring):
if substring == '':
return True
if string == '' or string[0] != substring[0]:
return False
return starts_with(string[1:], substring[1:])
if string == '' or substring == '':
return -1
if starts_with(string, substring):
return n
return find_substring(string[1:], substring, n + 1)
print(find_substring('ATACGTG', 'ACGT'))