📅  最后修改于: 2023-12-03 15:25:02.845000             🧑  作者: Mango
给定一个字符串,找到其中重复字符之间距离总和最小的最小字符。
例如:对于字符串 "ABBCCA",重复字符为 "BB" 和 "CC",其距离总和分别为 1+2=3 和 1+1=2。因此,在所有重复字符中,最小字符是 "B",其距离总和为 3,是所有可能性中最小的。
我们可以遍历字符串并记录每个字符的位置,然后再遍历一次找到每个重复字符之间的距离,最后选择距离总和最小的最小字符。
具体步骤如下:
positions
和 distances
。positions
记录每个字符出现的位置,distances
记录每个重复字符之间的距离。positions
中已经存在,则将它的位置加入对应的列表中;否则,在 positions
中新建一个键值对。positions
中的每个列表,计算每个重复字符之间的距离,并将结果存入 distances
中。distances
,选择距离总和最小的最小字符。代码实现:
def min_char_distance(s):
positions, distances = {}, {}
for i, c in enumerate(s):
if c in positions:
positions[c].append(i)
else:
positions[c] = [i]
for pos_list in positions.values():
for i in range(len(pos_list)-1):
pair = tuple(sorted([pos_list[i], pos_list[i+1]]))
dist = pair[1] - pair[0] - 1
if pair not in distances or dist < distances[pair]:
distances[pair] = dist
min_distance, min_char = float('inf'), ''
for char, pos_list in positions.items():
if len(pos_list) >= 2:
total_distance = sum([distances[tuple(sorted([pos_list[i], pos_list[i+1]]))] for i in range(len(pos_list)-1)])
if total_distance < min_distance or (total_distance == min_distance and char < min_char):
min_distance, min_char = total_distance, char
return min_char
assert min_char_distance('ABBCCA') == 'B'
assert min_char_distance('AABBCC') == 'A'
assert min_char_distance('ABABAB') == 'A'
assert min_char_distance('AAAAAA') == 'A'
assert min_char_distance('BCDEFG') == ''
以上示例都通过了测试,可以放心使用。
该题解法比较简单,只需要使用两个哈希表就可以解决。代码实现也不是很复杂,主要难点在于对列表和元组的操作,需要比较熟练掌握。