📅  最后修改于: 2023-12-03 14:56:53.786000             🧑  作者: Mango
有时候我们需要知道一个字符串中某个字符到其他字符的最短距离是多少,这可能会帮助我们更快地解决某些问题。这里我们介绍两种方法来实现这一功能。
暴力法很简单直接,我们可以遍历整个字符串,对于每个字符,再遍历一遍字符串,计算其与其他字符的距离,最后保存最短距离即可。
def shortest_distance(text, char):
n = len(text)
res = []
for i in range(n):
if text[i] == char:
res.append(0)
else:
min_distance = n
for j in range(n):
if text[j] == char:
min_distance = min(min_distance, abs(j - i))
res.append(min_distance)
return res
时间复杂度为$O(n^2)$,这个方法对于长度小的字符串可以接受,但是对于长字符串效率低下。
我们可以用双指针法来解决这个问题。从左到右遍历字符串,维护两个指针$left$和$right$,分别指向最近的字符$C$和当前遍历到的字符。当$right$指向$C$时,我们从$left$到$right$的所有字符的距离就是当前字符到$C$的最短距离。如果$left$不存在或从$left$到$right$的距离小于$left$到$C$的距离,则更新$res$数组。
def shortest_distance(text, char):
n = len(text)
res = [n] * n
left = -n
for right in range(n):
if text[right] == char:
left = right
res[right] = min(res[right], abs(right - left))
for right in range(n - 2, -1, -1):
if text[right] == char:
left = right
res[right] = min(res[right], abs(right - left))
return res
时间复杂度为$O(n)$,与字符串长度无关,是更优解。