Leet Code 解题笔记——字符串中的第一个唯一字符

题目描述:

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

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

解题思路:

# 从左往右对每个字符调用count方法,若计数为1,返回索引,若不为1,继续向后

if len(s) == 0:
    return -1
for i in range(len(s)):
    if s.count(s[i]) ==1:
        return i
    else :
        if i ==len(s)-1:
            return -1

方法应该是可行的,但是超时了……

然后构思了一个复杂度为n的算法。算法主要思想是建立一个以26个小写字母为键,以在s中的出现次数为值的字典。这个字典只需要遍历一遍s就可以得到。之后在字典中找到所有值为1的键,这些键在s字符串的位置可以通过s.find()方法找到,题目要求返回第一个不重复的字符串,所以只要返回这些键里在s中最靠前的那一个的索引就行了。

代码如下。

# 1. 建立以26个小写字母为键,每个值都是0的字典
keyslist = []
for i in range(26):
    keyslist.append(chr(i+97))
valuelist = [0]*26
d = dict(zip(keyslist, valuelist))

# 2. 遍历输入字符串,更新值
for i in range(len(s)):
    d[s[i]] +=1

# 3. 找到值为1的键
keys_1 = []  #keys_1是值为1的键的列表
for x in keyslist :
    c = d.get(x)
    if c ==1 :
        keys_1.append(x)
# 4. 确定这些键在s的位置,返回最靠前的一个
place = [] #是值为1的键在s中的位置的列表
if len(keys_1)==0 :
    return -1
else:
    for x in keys_1:
        place.append(s.find(x))
    
    return min(place)

 

全部评论

相关推荐

头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务