【程式碼】Python刷題
阿新 • • 發佈:2018-12-11
之前用C刷LeetCode,也就刷了60道吧,結果後來也不刷了。。。
現在主要用Python,刷一些題目熟悉語法,當然還有資料結構和演算法。
給定一個數組 strs,其中的資料都是字串,給定兩個字串 str1,str2。如果這兩個字串都在 strs陣列中,就返回它們之間的最小距離;如果其中任何一個不在裡面,則返回 -1;如果兩個字串相等,則返回 0。
例如:給定[‘’,’3’,’’,’5’,’10’,’9’,’7’,’1’,’’],再給定兩個字串’ ‘和’9’,通過函式求得返回值 3。
def min_distance(ss, s1, s2): if s1 not in ss or s2 not in ss: return -1 if s1 == s2: return 0 index1 = [] for i in range(len(ss)): if ss[i] == s1: index1.append(i) index2 = [] for i in range(len(ss)): if ss[i] == s2: index2.append(i) # 獲取兩個元素的索引,存入索引列表,並將其合併為一個索引總列表,並排序 index3 = sorted(index1+index2) # 儲存索引差,即字串距離 step = [] for i in range(len(index3)-1): # 如果索引總列表中相鄰兩個元素索引分別為兩個元素的索引,則將其新增到索引差列表中 if index3[i] in index1 and index3[i+1] in index2 or \ index3[i] in index2 and index3[i+1] in index1: step.append(index3[i+1] - index3[i]) # 找出索引差最小,即字串最小距離 print(min(step))
測試用例:
s = ['*', '3', '*', '5', '10', '9', '7', '3', '*']
s11 = '3'
s22 = '9'
min_distance(s, s11, s22)
100 0000次執行,時間約為2.70s,原文程式碼為3.67s,使用標記的辦法改進,時間1.78s
def min_distance2(ss, s1, s2): if s1 not in ss or s2 not in ss: return -1 if s1 == s2: return 0 # 雙標記 id1 = -1 id2 = -1 step = [] for i in range(len(ss)): if ss[i] == s1: id1 = i elif ss[i] == s2: id2 = i if id1 == -1 or id2 == -1: continue else: # 雙標記的差的絕對值即為距離 step.append(abs(id1-id2)) # print(min(step))