【发布时间】:2017-04-14 15:14:48
【问题描述】:
我正在尝试回答这个家庭作业问题:查找字符串中所有出现的模式。子字符串的不同出现可以相互重叠。
示例 1。
输入:
TACG
GT
输出:
解释:模式比文本长,因此在文本中没有出现。
示例 2。
输入:
ATA
ATATA
输出:
0 2
解释:模式出现在位置 1 和 3(并且这两个出现相互重叠)。
示例 3。
ATAT
GATATATGCATATACTT
输出:
1 3 9
说明:图案出现在文本中的位置 1、3 和 9。
我提交的答案是这个:
def all_indices(text, pattern):
i = text.find(pattern)
while i >= 0:
print(i, end=' ')
i = text.find(pattern, i + 1)
if __name__ == '__main__':
text = input()
pattern = input()
all_indices(text, pattern)
但是,此代码未通过最终测试用例:
失败案例 #63/64:超出时间限制(使用时间:7.98/4.00,使用内存:77647872/536870912。)
在线评委知道我在用 Python 发送答案,并且对于不同的语言有不同的时间限制。
我已经搜索了很多其他答案和方法:regexes、suffix trees、Aho-Corasick... 但到目前为止,它们都没有达到这个简单的解决方案(可能是因为 find 是 implemented in C? )。
所以我的问题是:有没有办法更快地完成这项任务?
【问题讨论】:
-
我不确定。这个错误对我来说似乎并不明显。如果你自己运行它,它最终会完成吗?需要多长时间?
-
执行此操作的任何算法都将花费与文本长度成正比的时间。所以他们总是可以使文本足够长以超过某个时间限制。
-
他们有没有告诉你字符串的最大可能长度?
-
最坏的情况是
pattern = 'A',text = 'A' * 10e6 -
一个优化是在
i > len(text) - len(pattern)时停止
标签: python python-3.x string-matching