《剑指offer》【第一次只出现一次的字符】(python版)

题目描述:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1.

思路:
第一种:扫描字符串,将每个字符与其它所有字符进行比较,如果没有相同,说明他就是第一个只出现一次的字符。算法时间复杂为 O(n2) O ( n 2 )

第二种:采用hash表,一次扫描字符串记录字符出现的次数数,第二次扫描字符串,在hash表找到第一个次数为1的字符,时间复杂度为 O(n) O ( n ) ,空间复杂度也为 O(n) O ( n )

class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        charcount = dict()
        slen = len(s)
        for ch in s:
            charcount[ch] = charcount.get(ch, 0) + 1
        # 注意这里不能直接遍历字典找value为1的key,因此字典是无序的
        for i in range(slen):
            if charcount.get(s[i]) == 1:
                return i
        return -1

    # python特别版
    def FirstNotRepeatingChar(self, s):
        return s.index(list(filter(lambda c:s.count(c)==1,s))[0]) if s else -1

'''
语法
filter(function, iterable)
参数
function -- 判断函数。
iterable -- 可迭代对象。
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值