前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 ># Leetcode 821. 字符的最短距离(简单)

# Leetcode 821. 字符的最短距离(简单)

作者头像
我是胖虎啊
发布2022-06-27 17:29:12
4380
发布2022-06-27 17:29:12
举报
文章被收录于专栏:测试开发卷货测试开发卷货

题目名称

821. 字符的最短距离

自己想的解法

题目思路

  • 遍历一遍字符串s,获取记录预期字符c在s中所有位置的列表 list_c
  • 定义一个方法: 获取输入字符 和 列表中所有元素 所有差值中绝对值最小的那个值
  • 遍历字符串s,每遍历到一个字符时,调用一次自定义方法,记录到数组中

code for Python3

代码语言:javascript
复制
class Solution:
    def shortestToChar(self, s: str, c: str) -> List[int]:
        list_c = [i for i in range(len(s)) if s[i] == c]
        arr = []
        for j in range(len(s)):
            arr.append(self.get_abs_minnum(j, list_c))
        return arr

    def get_abs_minnum(self, first_num:int, li:List):
        cur = pow(10, 4)
        for v in li:
            cur = min(cur, abs(v - first_num))
        return cur

复杂度分析

  • 时间复杂度: O(N²)   原因: 双层循环, 每次遍历字符串s时,都会遍历一次list_c
  • 空间复杂度: O(N)   原因: list_c占用的空间大小和字符串s的长度有关

官方题解

仔细研究了一下官方题解, 发现思路特别的巧妙, 其思路值得借鉴!

题目思路

  • 先从左到右遍历一次S, 记录当前字符与C距离的绝对值.在未出现预期值前,该位置用正无穷替代;出现预期值后,记录实际距离
  • 从右往左遍历一次S,同样的 记录当前字符与C距离的绝对值.
  • 在第2次遍历过程中, 取当前遍历结果的绝对值 与 第1次遍历值 的最小值,添加到数组中

code for Python3

代码语言:javascript
复制
class Solution(object):
    def shortestToChar(self, S, C):
        prev = float('-inf')
        arr = []
        for i, x in enumerate(S):
            if S[i] == C:
                prev = i
            else:
                arr.append(i - prev)
                
        prev = float('inf')
        for i in range(len(S) -1, -1, -1):
            if S[i] == C:
                prev = i
            else:
                arr.append(min(prev-i, arr[i]))
        return arr

复杂度分析

  • 时间复杂度: O(N)   原因: 仅遍历了2次字符串S
  • 空间复杂度: O(N)   原因: arr数组的长度

python的相关知识

  • enumerate 方法: 在输出数据结构的索引的时候使用
代码语言:javascript
复制
s = "abcdefg"
for i, j in enumerate(s):
    print(i, j)

结果为:
0 a
1 b
2 c
3 d
4 e
5 f
6 g

--------------------------------------------------

for k in enumerate(s):
    print(k)

结果为:
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')
(6, 'g')

  • 关于python中的无穷大, 无穷小
代码语言:javascript
复制
定义无穷大: float('inf')
定义无穷小: float('-inf')

特殊情况:
0*无穷大 or 0*无穷小   结果为nan(不是一个数, 所有和nan的相关计算都无法获取结果)

其它的示例:
float('nan') + 9999999   # nan
float('nan') - 9999999   # nan
float('nan') * 9999999   # nan

0 - 无穷小 -> 无穷大
0 - float('-inf')   # float('inf')
  • 列表的倒序输出
代码语言:javascript
复制
s = [1,2,3,4,5]
for i in range(len(s) - 1, -1, -1):
  print(s[i])

结果为:
5
4
3
2
1
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发卷货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目名称
    • 自己想的解法
      • 题目思路
        • code for Python3
          • 复杂度分析
            • 官方题解
              • 仔细研究了一下官方题解, 发现思路特别的巧妙, 其思路值得借鉴!
            • 题目思路
              • code for Python3
                • 复杂度分析
                  • python的相关知识
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档