算法笔记 -- 387. 字符串中的第一个唯一字符

68 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

 

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

  提示:

  • 1 <= s.length <= 10^5
  • s 只包含小写字母

二、思路分析:

如果字符串里面的某一个字符出现次数为1,则对应的value就是其索引;

如果字符串里面的某一个字符出现次数大于1,则对应的value可以设置为无限大

对letter_and_frequcy字典,进行所有value取min,

如果这个min全是无限大,就说明没有只出现一次的letter,

return -1

如果有“正常”的min(范围在len(s))内

就return 这个min

三、AC 代码:

class Solution:
    def firstUniqChar(self, s: str) -> int:
        letter_and_frequcy={}   #字典的key对应字符串中每一个字符
        for i in range(len(s)):
            if s[i] not in letter_and_frequcy:
                letter_and_frequcy[s[i]]=i
            else:
                letter_and_frequcy[s[i]]=len(s)+100
        vaule_list=letter_and_frequcy.values()
        if min(vaule_list)<(len(s)+100):
            return min(vaule_list)
        else:
            return -1

四、总结:

简单的哈希表,思路还是蛮清晰的哈~

也可以 使用string类自带的两个函数,find()和rfind();即从头查询与从尾查询。遍历字符串,并查找,若两个函数返回值相同,则该字符唯一。

范文参考

来看最优解,发现自己就是最优解,不过数据结构上应该采用更高级的结构 - 字符串中的第一个唯一字符 - 力扣(LeetCode)

中间对map具体取得用法不是很熟悉,好像用了两种用法,还需要细细研究 - 字符串中的第一个唯一字符 - 力扣(LeetCode)