字符最短的距离

128 阅读1分钟

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

题目描述

给你一个字符串 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' 出现在下标 35611 处(下标从 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]

思路分析

”找出离它最近的字符 C 的距离“,其实就是要找出每个字符从左边或者从右边到目标字符的最小距离。由于 1 <= s.length <= 10000,可以取prev较小值-10000和较大值10000;想要从左边算距离和从右边算距离,需要两次循环;从左往右遍历,假设当前的索引 i ,记录上一个目标字母出现的位置prev,那么在i左边中,当前字符S[i]距离目标字符最近的距离就是i - prev;从右边往左边遍历,操作和上面一样,最短距离就是prev - i;最后求两次的最小值。

AC代码

let str = 'sfsgggsfsadggg'
 function getDistance(S, C) {
    let res = [];
    let prev = -10001;
    for (let i = 0; i < S.length; i++) {
        if (S[i] == C) {
            prev = i;
        }
        res[i] = i - prev;
    }
    prev = 10001;
    for (let i = S.length - 1; i >= 0; i--) {
        if (S[i] == C) {
            prev = i;
        }
        res[i] = Math.min(res[i], prev - i);
    }
    console.log(res)
};
getDistance(str, 'f')