一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题给出两个参数,字符串s和字符c.
- 字符串s和字符c,都是小写字母
- 字符串s长度为10^4
二、思路分析:
今天拿到本题,读完题意要求很简单,求出字符串s与目标字符c的相对最短距离,那怎么在字符串s中找到目标字符c,然后求出每一个字符的索引位置,又是一个🔥脑的题目。
按照菜鸟思路,可能会是这样无脑嵌套循环,求出字符串s每一个字符的相对索引位置:
- 先使用for循环取出每一个字符s[i]
- 然后再使用for循环再求出s[i]与目标字符c的相对索引
- 逆向遍历再使用嵌套循环,取出最小值 使用嵌套循环,执行的结果直接就是超出时间限制🚫
那有什么办法,不使用嵌套循环,就能求出每一个字符相对目标字符的位置?
- 先定义一个初始值cur最大数或最小数(注:不能影响结果的值)如:-len(s)
- 先使用for循环正向遍历(从左到右),当s[i]==c时,则cur=i,ans[i]=i-cur
- 对变量cur重新赋值2*len(s)
- 再使用for循环逆向遍历(从右到左),当s[j]==c时,则cur=j,ans[j]=cur-j
根据以上思路,我们用Python能快速实现,代码如下:
class Solution(object):
def shortestToChar(self, s, c):
"""
:type s: str
:type c: str
:rtype: List[int]
"""
ans = [0]*len(s)
cur = -len(s)
for i in range(len(s)):
if s[i] == c:cur = i
ans[i] = i - cur
cur = 2*len(s)
for j in range(len(s)-1,-1,-1):
if s[j] == c:cur = j
ans[j] = min(ans[j],cur-j)
return ans
三、总结:
本题主要考察对索引位置的处理,难点在于一定要定义一个比较大数或着小的数,AC记录如下:
时间复杂度O(n)
空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~