打印列表中的第一个,第二个出现的字符

时间:2018-09-11 11:34:50

标签: python algorithm

我正在研究一种简单的算法,可以打印出出现两次或更多次的第一个字符。

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)中做到这一点?

2 个答案:

答案 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)中使用索引和搜索