获取一个字符串中第一个只出现过一次的字符及其位置

分析:

首先我们需要统计得到所有字符出现的次数以及其位置,然后比对出现次数为1的字符的位置,最小的即所求

假设字符串为:

'stringisastaringb'

解法一:

def first_not_repeating_char(string):
    if not string:
        return -1
    resultDict = {}
    for k, s in enumerate(string):
        resultDict [s] = [resultDict [s][0] + 1,k] if resultDict .get(s) else [1,k]
    pos = len(string)
    ret = None
    for x in resultDict :
        if resultDict [x][0] ==1 and resultDict [x][1] <pos:
            pos = resultDict [x][1]
            ret = (x,pos)
    return ret

其中涉及的数据结构如下示例:

统计结果:{'a': [2, 9], 'b': [1, 16], 'g': [2, 15], 'i': [3, 13], 'n': [2, 14], 's': [3, 10], 'r': [2, 12], 't': [2, 11]}

返回结果:('b', 16)

解法二:

借助两个字典一个存个数,一个存位置;
def first_not_repeating_char(string):
    if not string:
        return -1
    count = {}
    loc = {}
    for k, s in enumerate(string):
        count[s] = count[s] + 1 if count.get(s) else 1
        loc[s] = loc[s] if loc.get(s) else k
    pos = len(string)
    ret = None
    for k in loc.keys():
        if count.get(k) == 1 and loc[k] < pos:
            pos = loc[k]
            ret = (k,loc[k])
    return ret

其中涉及的数据结构如下示例:

count {'a': 2, 'b': 1, 'g': 2, 'i': 3, 'n': 2, 's': 3, 'r': 2, 't': 2}

loc {'a': 8, 'b': 16, 'g': 5, 'i': 3, 'n': 4, 's': 7, 'r': 2, 't': 1}

('b', 16)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值