【LeetCode 簡單題】85-字串中第一個唯一字元
阿新 • • 發佈:2018-12-20
宣告:
今天是第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