[leetcode 821. Shortest Distance to a Character] 가장 짧은 문자거리
설명
문자열 s가 주어질 때 s의 각 문자가 c와 떨어진 최단거리를 반환하는 문제이다.
예를 들어, s = 'test' , c = 'e' 일 때 [1, 0, 1, 2]를 반환해야 한다.
(t는 e에서 1만큼 떨어져있고, e는 0, s는 1, 마지막 t는 2만큼 떨어져있기 때문이다.)
Problem
Given a string s and a character c that occurs in s, return an array of integers answer where answer.length == s.length and answer[i] is the distance from index i to the closest occurrence of character c in s.
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 <= 104
- s[i] and c are lowercase English letters.
- It is guaranteed that c occurs at least once in s.
풀이
아래의 방법은 O(n)의 시간복잡도를 가진다.
1) 먼저 문자열의 길이만큼 반복문이 돌면서 각 캐릭터가 c와 같은지 체크
2) 같으면 distance를 0으로 할당하고 result에 입력
3) 같지 않으면 distance에 +1을 하고 distance를 result에 입력
(3번까지의 과정이 c가 왼쪽에 존재할 때의 거리를 result에 저장해놓은 것이다.)
4) 반대로 for문을 뒤에서부터 돌면서 각 캐릭터가 c와 같은지 체크
5) 같으면 distance를 0으로 할당하고
6) 같지 않으면 distance에 +1을 하고
7) result에 저장되어 있는 값과 비교해서 더 작은 값을 result[i]에 할당
(4번부터 7번까지의 과정이 c가 오른쪽에 존재할 때의 거리를 체크한 것이다.)
function ShortestDistance(s, c) {
const result = [];
let distance = 105;
for (const char of s) {
if (char === c) {
distance = 0;
result.push(distance);
} else {
distance++;
result.push(distance);
}
}
distance = 105;
for (let i = s.length - 1; i >= 0; i--) {
if (s[i] === c) {
distance = 0;
} else {
distance++;
result[i] = Math.min(result[i], distance);
}
}
return result;
}