1. 程式人生 > >【LeetCode 簡單題】85-字串中第一個唯一字元

【LeetCode 簡單題】85-字串中第一個唯一字元

宣告:

今天是第85道題。給定n,從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個數字。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事項:您可以假定該字串只包含小寫字母。

解法1。用一個字典存放輸入字串出現的字元極其出現頻數的對應關係,然後再去遍歷字串s,一旦找到頻數為1的字元即返回對應index,程式碼如下。

執行用時: 128 ms, 在First Unique Character in a String的Python提交中擊敗了71.65% 的使用者

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 基線條件,判斷輸入為空時的情況
        if not s:
            return -1

        s_dict = {}
        for i in s:
            if i not in s_dict:
                s_dict[i] = 1
            else:
                s_dict[i] += 1
        for i in range(len(s)):
            if s_dict[s[i]] == 1:
                return i
            else:
                continue
        return -1

解法2。利用內建字串屬性s.count(i)和s.index(i)遍歷字串然後返回下標最小的那個下標,程式碼如下。

執行用時: 64 ms, 在First Unique Character in a String的Python提交中擊敗了86.02% 的使用者 

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """
        lis = [s.index(i) for i in s if s.count(i) == 1]
        return min(lis) if lis else -1

 解法3。也是利用字串屬性s.find(i)和s.rfind(i)遍歷字串,如果只出現1次的話那麼這2者的值應該是一樣的,沒找到則返回-1,程式碼如下。

執行用時: 300 ms, 在First Unique Character in a String的Python提交中擊敗了25.20% 的使用者

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return -1
        s_str = s
        l = len(s)
        p = l
        for i in s_str:
            start = s.find(i)
            end = s.rfind(i)
            if start != -1 and start == end:    # 找得到該字元且只出現了1次,其實這個地方完全可以去掉start != -1這個判斷條件
                p = min(p,start)
        if p == l:
            return -1    # 說明p沒有被更新,沒找到只出現1次的字元
        return p

結尾

解法1:原創

解法2&解法3:LeetCode