821. 字符的最短距离
https://leetcode-cn.com/problems/shortest-distance-to-a-character
题目描述
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
示例 1:
输入: S = "loveleetcode", C = 'e'
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
说明:
- 字符串 S 的长度范围为 [1, 10000]。
- C 是一个单字符,且保证是字符串 S 里的字符。
- S 和 C 中的所有字母均为小写字母。
前置知识
数组的遍历(正向遍历和反向遍历)
思路
这道题就是让我们求的是向左或者向右距离目标字符最近的距离。
我画了个图方便大家理解:

比如我们要找第一个字符 l 的最近的字符 e,直观的想法就是向左向右分别搜索,遇到字符 e 就停止,比较两侧的距离,并取较小的即可。如上图,l 就是 3,c 就是 2。
这种直观的思路用代码来表示的话是这样的:
Python Code:
复杂度分析
时间复杂度:$O(N^2)$
空间复杂度:$O(1)$
由于题目的数据范围是 $10^4$,因此通过所有的测试用例是没有问题的。
但是实际上,我们可以在线性的时间内解决。这里的关键点和上面的解法类似,也是两端遍历。不过不再是盲目的查找,因为这样做会有很多没有必要的计算。
我们可以使用空间换时间的方式来解,这里我使用类似单调栈的解法来解,大家也可以使用其他手段。关于单调栈的技巧,不在这里展开,感兴趣的可以期待我后面的专题。
复杂度分析
时间复杂度:$O(N)$
空间复杂度:$O(N)$
实际上,我们根本不需要栈来存储。原因很简单,那就是每次我们碰到目标字符 C 的时候, 我们就把栈全部清空了,因此我们用一个变量标识即可,具体参考后面的代码区。
如果碰到目标字符 C 的时候,不把栈清空,那么这个栈的空间多半是不能省的,反之可以省。
代码
代码支持:Python3,Java, CPP, Go, PHP
Python3 Code:
Java Code:
CPP Code:
Go Code:
PHP Code:
复杂度分析
时间复杂度:$O(N)$
空间复杂度:$O(1)$
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
最后更新于
这有帮助吗?