Shortest Distance to a Character

easy array two-pass string

Problem

Given a string s and a character c that appears in s, return an array of integers where answer[i] is the distance from index i to the closest occurrence of c in s.

Inputs = "loveleetcode", c = "e"
Output[3,2,1,0,1,0,0,1,2,2,1,0]
Each position records the minimum distance to the nearest "e".

def shortestToChar(s, c):
    n = len(s)
    res = [n] * n
    prev = -n
    for i in range(n):
        if s[i] == c: prev = i
        res[i] = i - prev
    prev = 2 * n
    for i in range(n - 1, -1, -1):
        if s[i] == c: prev = i
        res[i] = min(res[i], prev - i)
    return res
function shortestToChar(s, c) {
  const n = s.length;
  const res = new Array(n).fill(n);
  let prev = -n;
  for (let i = 0; i < n; i++) {
    if (s[i] === c) prev = i;
    res[i] = i - prev;
  }
  prev = 2 * n;
  for (let i = n - 1; i >= 0; i--) {
    if (s[i] === c) prev = i;
    res[i] = Math.min(res[i], prev - i);
  }
  return res;
}
class Solution {
  public int[] shortestToChar(String s, char c) {
    int n = s.length();
    int[] res = new int[n];
    int prev = -n;
    for (int i = 0; i < n; i++) {
      if (s.charAt(i) == c) prev = i;
      res[i] = i - prev;
    }
    prev = 2 * n;
    for (int i = n - 1; i >= 0; i--) {
      if (s.charAt(i) == c) prev = i;
      res[i] = Math.min(res[i], prev - i);
    }
    return res;
  }
}
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        int n = s.size();
        vector<int> res(n, n);
        int prev = -n;
        for (int i = 0; i < n; i++) {
            if (s[i] == c) prev = i;
            res[i] = i - prev;
        }
        prev = 2 * n;
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] == c) prev = i;
            res[i] = min(res[i], prev - i);
        }
        return res;
    }
};
Time: O(n) Space: O(n)