1. 程式人生 > >獲取一個字串中第一個只出現過一次的字元及其位置

獲取一個字串中第一個只出現過一次的字元及其位置

分析:

首先我們需要統計得到所有字元出現的次數以及其位置,然後比對出現次數為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)