【LeetCode】821. 字符的最短距离

141 阅读2分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题给出两个参数,字符串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

image.png

image.png

根据以上思路,我们用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记录如下: image.png 时间复杂度O(n)

空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~