821.字符的最短距离-力扣(LeetCode)

简介: 821.字符的最短距离-力扣(LeetCode)

题目详情

简单


给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。

示例

  • 示例 1:

输入:

s = "loveleetcode", c = "e"

输出:

[3,2,1,0,1,0,0,1,2,2,1,0]

解释:


字符 ‘e’ 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。


距下标 0 最近的 ‘e’ 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。


距下标 1 最近的 ‘e’ 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。


对于下标 4 ,出现在下标 3 和下标 5 处的 ‘e’ 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。


距下标 8 最近的 ‘e’ 出现在下标 6 ,所以距离为 abs(8 - 6) = 2 。


  • 示例 2:

输入:

s = "aaab", c = "b"

输出:

[3,2,1,0]

提示

  • 1 <= s.length <= 104
  • s[i] 和 c 均为小写英文字母
  • 题目数据保证 c 在 s 中至少出现一次

题解

/**
  @ 一小池勺 
 * @param {string} s
 * @param {character} c
 * @return {number[]}
  @ 2024 1 30
 */
var shortestToChar = function(S, C) {
  const resultArray = new Array(S.length).fill(0)
  let NowTargetCharC_Index = 0

  // 一次遍历
  const charArray = Array.from(S) // 将字符串转换为数组
  charArray.forEach((item, index) => {
    if(item === C) {
      resultArray[index] = 0
      NowTargetCharC_Index = index
    } else {
      // 针对当前的 i 元素 => 进行前后距离比较
      resultArray[index] = Math.min(Math.abs(S.indexOf(C, index) - index), Math.abs(S.indexOf(C, NowTargetCharC_Index) - index))
    }
  })

  return resultArray
}

代码思路

  • 创建一个与字符串长度相同的数组resultArray,并将其填充为0。
  • 初始化变量NowTargetCharC_Index为0,用于记录当前目标字符C的索引位置。
  • 将字符串转换为字符数组charArray。
  • 使用forEach方法遍历charArray中的每个字符。
  • 如果当前字符等于目标字符C,将resultArray相应索引位置的值设置为0,并更新NowTargetCharC_Index为当前索引。
  • 如果当前字符不等于目标字符C,通过indexOf方法分别计算当前索引位置到目标字符C的前一个索引位置和后一个索引位置的距离,并将较小的距离赋值给resultArray相应索引位置。
  • 返回resultArray作为结果。



目录
相关文章
|
6天前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
37 14
|
1月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
55 4
|
1月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
60 10
|
7月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
294 0
Leetcode第三题(无重复字符的最长子串)
|
7月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
127 1
|
7月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
168 0
|
7月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
63 0
|
7月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
106 0
|
9月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
8月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
117 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行

热门文章

最新文章