我正在研究一种简单的算法,可以打印出出现两次或更多次的第一个字符。
for eg:
string ='abcabc'
output = a
string = 'abccba'
output = c
string = 'abba'
output = b
我所做的是:
string = 'abcabc'
s = []
for x in string:
if x in s:
print(x)
break
else:
s.append(x)
output: a
但是它的时间复杂度是O(n ^ 2),如何在O(n)中做到这一点?
答案 0 :(得分:4)
将s = []
更改为s = set()
(显然将相应的append
更改为add
)。与列表上的in
相比,in
的集合为O(1)。
或者,使用正则表达式(O(n ^ 2),但又快速又容易):
import re
match = re.search(r'(.).*\1', string)
if match:
print(match.group(1))
正则表达式(.).*\1
的意思是“以后我们会记住的任何字符,中间有任意数量的字符,然后又是记住的字符”。由于正则表达式是从左到右扫描的,因此它将根据需要在a
中找到"abba"
而不是b
。
答案 1 :(得分:3)
使用字典
string = 'abcabc'
s = {}
for x in string:
if x in s:
print(x)
break
else:
s[x] = 0
或使用集
string = 'abcabc'
s = set()
for x in string:
if x in s:
print(x)
break
else:
s.add(x)
两个字典和集合都在O(1)中使用索引和搜索