821. 字符的最短距离

139 阅读2分钟

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

一、题目描述

  • 给你一个字符串 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 <= 10000
    • s[i] 和 c 均为小写英文字母
    • 题目数据保证 c 在 s 中至少出现一次

二、思路分析:

  • 对于字符串只存在一个字符c的时候
    • 只需要遍历这个字符串,将每个下标减去字符c在字符串当中的下标,然后再去绝对值,就能够得到答案,参考示例2
  • 对于字符串存在很多个字符c,如示例1
    • 首先遍历字符串,找到字符c在字符串中的所有位置下标
    • 然后遍历整个字符串,将字符串的每一个下标与字符c的每一个位置下标相减取绝对值
    • 然后利用Math.min方法得到最小的差值,添加进定义好的数组变量保存
    • 遍历完返回保存结果的数组变量

三、AC 代码:

function shortestToChar(s: string, c: string): number[] {
    let result  = [];
    let cIndex = [];
    for(let i = 0; i < s.length; i++){
        if(s[i] === c){
            cIndex.push(i)
        }
    }
    for(let i = 0; i < s.length; i++){
        let minIndex = s.length - 1;
        for(let j = 0; j < cIndex.length; j++){
            minIndex = Math.min(minIndex, Math.abs(cIndex[j] - i));
        }
        result.push(minIndex);
    }
    return result;
};

四、总结:

  • 数字取绝对值方法Math.abs(num),多个数字求最小值方法Math.min(num1, num2...)
  • 定义minIndex初始值时,因为求得是最小值,所以初始值不能为0,如果初始值为0,那么结果永远是0。所以这里定义的初始值为s.length - 1,因为差值最大的就是s.length - 1
  • 题目简单难度,更多解题方式,移步题解区

image.png