給定一個(gè)字符串,找到它的第一個(gè)不重復(fù)的字符,并返回它的索引。如果不存在,則返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
解題思路
這道題最優(yōu)的解法就是線性復(fù)雜度,為了保證每個(gè)元素都是唯一的,就是要遍歷一遍字符串,然后把字符串中每個(gè)字符出現(xiàn)的次數(shù)存放在哈希表中,這個(gè)過(guò)程的時(shí)間復(fù)雜度時(shí)O(N),N是字符串的長(zhǎng)度;接下來(lái)遍歷hash表,檢查遍歷的字符是不是唯一的,如果是唯一的,直接返回當(dāng)前下標(biāo)。第二次遍歷的時(shí)間復(fù)雜度也是O(N)。代碼如下
class Solution:
def firstUniqChar(self, s: str) -> int:
dic = {}
# 記錄字符出現(xiàn)次數(shù)
for c in s:
dic[c] = dic[c] + 1 if c in dic else 1
index = 0
for ch in s:
if dic[ch] == 1:
return index
else:
index += 1
return -1
還有一種方法是使用collections.Counter()來(lái)計(jì)算字符數(shù)
class Solution:
def firstUniqChar(self, s: str) -> int:
counter = collections.Counter(s)
index = 0
for ch in s:
if counter[ch] == 1:
return index
else:
index += 1
return -1