跳至主要內容

821. 字符的最短距离


821. 字符的最短距离

🟢   🔖  数组 双指针 字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

Given a string s and a character c that occurs in s, return an array of integersanswer whereanswer.length == s.length andanswer[i]_is the distance from index _i to the closest occurrence of characterc ins.

The distance between two indices i and j is abs(i - j), where abs is the absolute value function.

Example 1:

Input: s = "loveleetcode", c = "e"

Output: [3,2,1,0,1,0,0,1,2,2,1,0]

Explanation: The character 'e' appears at indices 3, 5, 6, and 11 (0-indexed).

The closest occurrence of 'e' for index 0 is at index 3, so the distance is abs(0 - 3) = 3.

The closest occurrence of 'e' for index 1 is at index 3, so the distance is abs(1 - 3) = 2.

For index 4, there is a tie between the 'e' at index 3 and the 'e' at index 5, but the distance is still the same: abs(4 - 3) == abs(4 - 5) = 1.

The closest occurrence of 'e' for index 8 is at index 6, so the distance is abs(8 - 6) = 2.

Example 2:

Input: s = "aaab", c = "b"

Output: [3,2,1,0]

Constraints:

  • 1 <= s.length <= 10^4
  • s[i] and c are lowercase English letters.
  • It is guaranteed that c occurs at least once in s.

题目大意

给你一个字符串 s 和一个字符 c ,且 cs 中出现过的字符。

返回一个整数数组 answer ,其中 answer.length == s.lengthanswer[i]s 中从下标 i 到离它 最近 的字符 c距离

两个下标 ij 之间的 距离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 <= 10^4
  • s[i]c 均为小写英文字母
  • 题目数据保证 cs 中至少出现一次

解题思路

这道题可以通过两次遍历字符串 s 来解决,分别从左到右和从右到左更新距离。

  1. 从左到右遍历

    • 遍历字符串 s,记录每个位置距离上一个字符 c 的距离。
    • 如果当前位置是字符 c,更新上一个字符 c 为当前位置。
  2. 从右到左遍历

    • 再次遍历字符串 s,更新每个位置距离下一个字符 c 的距离,取两个方向的最小值。

这样可以确保每个位置的最小距离都被正确更新。

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串的长度,需要遍历两次字符串。
  • 空间复杂度O(n),使用了一个长度为 n 的数组存储答案数组。

代码

/**
 * @param {string} s
 * @param {character} c
 * @return {number[]}
 */
var shortestToChar = function (s, c) {
	const n = s.length;
	const res = new Array(n).fill(Infinity);

	// 从左到右更新距离
	let prev = -Infinity; // 记录上一个字符 c 的位置
	for (let i = 0; i < n; i++) {
		if (s[i] === c) {
			prev = i;
		}
		res[i] = i - prev;
	}

	// 从右到左更新距离
	prev = Infinity; // 记录下一个字符 c 的位置
	for (let i = n - 1; i >= 0; i--) {
		if (s[i] === c) {
			prev = i;
		}
		res[i] = Math.min(res[i], prev - i);
	}

	return res;
};

相关题目

题号标题题解标签难度力扣
2399检查相同字母间的距离数组 哈希表 字符串🟢🀄️open in new window 🔗open in new window