天天看點

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

以下為我的天梯積分規則:

每日至少一題:一題積分+10分

若多做了一題(或多一種方法解答),則當日積分+20分(+10+10)

若做了三道以上,則從第三題開始算+20分(如:做了三道題則積分-10+10+20=40;做了四道題則積分–10+10+20+20=60)

初始分為100分

若差一天沒做題,則扣積分-10分(周六、周日除外注:休息)

堅持!!!

初級算法

刷題目錄

字元串

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python
<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

題幹

給定一個字元串,找到它的第一個不重複的字元,并傳回它的索引。如果不存在,則傳回 -1。

示例:

s = “leetcode”

傳回 0

s = “loveleetcode”

傳回 2

提示:你可以假定該字元串隻包含小寫字母。

哈希表

分析:

本題找到不重複的字元,很明顯的暗示,讓我們用字典,哈希表來解題。通過字典确定每個字元的個數,然後再選出隻有單次出現的字元,且選出最先出現的,傳回其相對應的索引号。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 哈希表
        hashmap = {}
        for i in s:
            if i not in hashmap:
                hashmap.update({i:s.count(i)}) # 将數字各自出現的個數存入哈希表中

        for key,value in hashmap.items():   # 周遊哈希表的鍵值
            if hashmap[key] == 1:
                return s.index(key)
        return -1      

哈希表的速度表現還不錯的!~

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

索引count

我們還可以将字元串取為單個字元成list後,通過count計數,看在其中的個數是多少,周遊所有項,删除多餘的項,若大于1,則不傳回;若僅有一個字元,則傳回其對應的索引号。若不存在,則傳回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的單個字母取出來為單個字元串
        list1 = list(map(str, s))
        n = len(list1)
        temp = 0
        list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,則删除list2裡的對應值
        # 判斷是否存在上述情況
        for j in list1:
            if list1.count(j) == 1:
                temp += 1
        if temp > 0:
            return list1.index(list2[0])   # 查詢list2中删除完
        return -1      

額,勇氣可嘉,超出時間限制了,感覺不應該的啊

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

我們再進行優化一下

将temp的判斷再細化一下

不周遊所有直接讀取list2的參數,看是否删除了相同的值之後還存在值,如果還有則,傳回第一個,如果沒有,則傳回-1。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的單個字母取出來為單個字元串
        list1 = list(map(str, s))
        n = len(list1)
        list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,則删除list2裡的對應值
        # 判斷是否存在上述情況
        if len(list2) > 0:
            return list1.index(list2[0])   # 查詢list2中删除完
        return -1      

還是太菜了,超出時間限制了

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

不過肯定是能用的。

咱們隻用内置函數試試

class Solution:
    def firstUniqChar(self, s: str) -> int:
        for i in range(len(s)):
            if s.count(s[i]) == 1:
                return i
        return -1      
<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

實時證明,确實很慢很慢,不考慮了。

兩次周遊

我們可以使用兩次周遊來輸出,第一次周遊,将每個數字出現的次數儲存在一個list中,第二次周遊這個list,如果一遇到值為1,則輸出1所在的索引值,否則,傳回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
        c1 = []
        n = len(s)
        for i in range(n):
            c1.append(s.count(s[i]))
        
        for j in range(n):
            if c1[j] == 1:
                return j
        return -1      

勇氣可嘉,怎麼還是超出時間限制啊o(╥﹏╥)o

<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python

find和rfind

此法骨骼極其清奇,簡直不要太妙了。一個從前查找,一個從後查找,如果下标相等,說明隻出現了一次

class Solution:
    def firstUniqChar(self, s: str) -> int:
        for x in s:
            if s.find(x) == s.rfind(x):
                return s.find(x)
        return -1      
<LeetCode天梯>Day017 字元串中的第一個唯一字元(哈希表+find&rfind) | 初級算法 | Python