给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
输入: s = “leetcode”
输出: 0
输入: s = “loveleetcode”
输出: 2
输入: s = “aabb”
输出: -1
from typing import List
import collections
class Solution:
def firstUniqChar(self, s: str) -> int:
# 遍历字符串
for i in range(len(s)):
if s.count(s[i]) == 1:
return s.index(s[i])
return -1
# 遍历字符串
for i in s:
if s.find(i) == s.rfind(i):
return s.find(i)
return -1
# 哈希表
fr = Counter(s)
for i, ch in enumerate(s):
if fr[ch] == 1:
return i
return -1
if __name__ == '__main__':
s = "loveleetcode"
a = Solution()
print(a.firstUniqChar(s))
题目要求返回字符串中的第一个不重复元素的下标:
(1)思路1:循环遍历所有字符串的值,如果某个值的数量不等于1,则返回这个元素的下标。
循环遍历结束,如果还没有等于1的,则返回-1
(2)思路2:循环遍历字符串,如果从左边找到的元素下标 == 从右边找到的元素下标,则返回该元素的下标
遍历结束,否则等于-1。
对比思路2,在1中我没有直接遍历字符串,梳理数组,发现所有数组除了数字需要range() 转化,其他都可以作为迭代器被遍历
(3) 哈希表
哈希表存储次数,遍历字符串的下标和值,如果在哈希表中值=1,则返回,否则-1
这里定义了 fr = collections.Counter(s),其中 collections 是容器数据类型,这个模块实现了特定目标的容器,
替代python的标准内建容器:dict、list、set、tuple,其中 Counter 类是字典的子类,提供立刻哈希对象的计数功能
import collections
s = "jiaotengfei"
frequency = collections.Counter(s)
print(frequency)
# Counter({'i': 2, 'e': 2, 'j': 1, 'a': 1, 'o': 1, 't': 1, 'n': 1, 'g': 1, 'f': 1})
from collections import Counter
a = Counter() # 一个空容器
a1 = Counter('gallahad') # 从迭代器中创建新容器
a2 = Counter({'red': 4, 'blue': 2}) # 从映射中创建新容器
a3 = Counter(cats=4, dogs=8) # 从关键字中创建新容器
print(a)
print(a1)
print(a2)
print(a3)
哈希(hash的直译)表,翻译过来时散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。