【发布时间】:2017-06-10 03:58:17
【问题描述】:
我在做 leetcode 问题No. 387. First Unique Character in a String。给定一个字符串,找到其中的第一个非重复字符并返回它的索引。如果不存在,则返回 -1。
例子:
s = "leetcode"
return 0.
s = "loveleetcode",
return 2.
我写了2个算法:
方法一
def firstUniqChar(s):
d = {}
L = len(s)
for i in range(L):
if s[i] not in d:
d[s[i]] = [i]
else:
d[s[i]].append(i)
M = L
for k in d:
if len(d[k])==1:
if d[k][0]<M:
M = d[k][0]
if M<L:
return M
else:
return -1
这非常直观,即首先通过循环遍历s 中的所有字符来创建一个计数字典(这也可以使用collections.Counter 中的一行来完成),然后进行第二次循环,仅检查那些value 是长度为 1 的列表。我认为当我做了 2 个循环时,它必须有一些冗余计算。所以我写了第二个算法,我认为它比第一个更好,但是在 leetcode 平台上,第二个比第一个运行得慢得多,我不知道为什么。
方法二
def firstUniqChar(s):
d = {}
L = len(s)
A = []
for i in range(L):
if s[i] not in d:
d[s[i]] = i
A.append(i)
else:
try:
A.remove(d[s[i]])
except:
pass
if len(A)==0:
return -1
else:
return A[0]
第二个只为s中的所有字符循环一次
【问题讨论】:
-
A.remove(...)在A上循环。重复这样做很昂贵。 -
@user2357112 谢谢!
标签: python algorithm time-complexity