Talentd
FleetCode
Make and follow sheets.Sign in

Shortest Distance to a Character solution and explanation

EasyArrayStringTwo Pointers4 min read72.7% acceptanceUpdated 9 Apr 2026
LeetCode Shortest Distance to a Character Solution Explained - JavaNick White · 11:14 · 11K viewsWatch on YouTube
9 more videos on this problem
  1. LeetCode Shortest Distance to a Character Solution Explained - JavaNick White · 11:14 · 11K views
  2. Shortest Distance to a Character | Live Coding with Explanation | Leetcode #821Algorithms Made Easy · 5:41 · 5K views
  3. Shortest Distance to a Character | Leetcode 821Coding Decoded · 12:37 · 2K views
  4. Leetcode - Shortest Distance to a Character (Python)Timothy H Chang · 6:02 · 2K views
  5. 821. Shortest Distance to a Character | LEETCODE EASYcode Explainer · 6:32 · 1K views
  6. Shortest Distance to a Character | LeetCode 821 | Coders CampCoders Camp · 14:56 · 718 views
  7. Leetcode 821. Shortest Distance to a Character PythonTechZoo · 3:32 · 653 views
  8. 821. Shortest Distance to a Character (Leetcode Easy)Programming Live with Larry · 7:55 · 579 views
  9. Leetcode 821 Shortest Distance to a Character - Facebook, Google Coding Interview QuestionAlgorithmicIQ · 26:44 · 316 views
  10. 821. Shortest Distance to a Character Leetcode problem/ Explanation + C++ codeCoding with U · 4:40 · 303 views

The 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.

Approach overview

Problem Overview: Given a string s and a target character c, compute the shortest distance from every index in the string to the nearest occurrence of c. The result is an integer array where each position stores the minimum distance to that character.

Approach 1: Brute Force Scan (O(n2) time, O(n) space)

The direct approach checks every index in the string and searches for the closest occurrence of c. For position i, iterate across the entire string and compute |i - j| whenever s[j] == c, keeping the minimum distance. Store that value in the result array. This method is straightforward and demonstrates the core idea of measuring absolute distances, but it repeatedly scans the string for every index. With n characters, the nested iteration leads to O(n2) time and O(n) space for the output array. Useful as a baseline but inefficient for large inputs.

Approach 2: Two Pass Approach (O(n) time, O(n) space)

The optimal solution observes that the closest occurrence of c must come either from the left side or the right side of a given index. Perform two linear scans of the string. In the first pass (left to right), track the most recent index where c appeared and compute the distance from that position. Store it in the result array. In the second pass (right to left), repeat the same logic but track the closest occurrence on the right and update the array using min(currentDistance, rightDistance). This guarantees the minimum distance from both directions. The algorithm processes each character twice, resulting in O(n) time and O(n) space.

This technique is essentially a directional scan over an array representation of the string. It avoids repeated searches and relies on simple arithmetic distance updates. The pattern appears frequently in problems involving nearest elements in a string or distance propagation across indices.

Recommended for interviews: Interviewers expect the two-pass linear scan. Starting with the brute force approach shows you understand the distance calculation, but quickly optimizing to the two-direction scan demonstrates strong problem-solving skills. The optimized approach uses constant work per index and resembles classic two pointers-style directional traversal patterns.

Approach 1: Two Pass Approach

This approach involves two passe through the string:

  1. First Pass: Traverse the string from left to right, keeping track of the most recent index of character c. Calculate the distance from the current index to this recent c.
  2. Second Pass: Traverse from right to left, updating the distances with the minimum between the current distance and the new distance to the closest c found on this traversal.

This ensures each element in the result is the minimum distance to any occurrence of c.

def shortestToChar(s: str, c: str) -> list:
    n = len(s)
    result = [0] * n
    prev = float('-inf')
    
    # First pass - left to right
    for i in range(n):
        if s[i] == c:
            prev = i
        result[i] = i - prev
    
    # Second pass - right to left
    prev = float('inf')
    for i in range(n - 1, -1, -1):
        if s[i] == c:
            prev = i
        result[i] = min(result[i], prev - i)

    return result
import java.util.*;

class Solution {
    public int[] shortestToChar(String s, char c) {
        int n = s.length();
        int[] result = new int[n];
        int prev = -n;
        
        // Left to right
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == c) prev = i;
            result[i] = i - prev;
        }
        
        // Right to left
        for (int i = n - 1, prev = 2 * n; i >= 0; i--) {
            if (s.charAt(i) == c) prev = i;
            result[i] = Math.min(result[i], prev - i);
        }
        return result;
    }
}
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

vector<int> shortestToChar(string s, char c) {
    int n = s.size();
    vector<int> result(n, n);
    int prev = -n;
    
    // Left to right
    for (int i = 0; i < n; ++i) {
        if (s[i] == c) prev = i;
        result[i] = i - prev;
    }
    
    // Right to left
    for (int i = n - 1, prev = 2 * n; i >= 0; --i) {
        if (s[i] == c) prev = i;
        result[i] = min(result[i], prev - i);
    }
    return result;
}
var shortestToChar = function(s, c) {
    const result = new Array(s.length).fill(0);
    let prev = -Infinity;
    
    // Left to right
    for (let i = 0; i < s.length; i++) {
        if (s[i] === c) prev = i;
        result[i] = i - prev;
    }
    
    // Right to left
    prev = Infinity;
    for (let i = s.length - 1; i >= 0; i--) {
        if (s[i] === c) prev = i;
        result[i] = Math.min(result[i], prev - i);
    }
    return result;
};
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

int* shortestToChar(char* s, char c, int* returnSize) {
    int len = strlen(s);
    *returnSize = len;
    int* result = (int*)malloc(len * sizeof(int));
    int prev = -INT_MAX;
    
    // First pass - left to right
    for(int i = 0; i < len; i++) {
        if (s[i] == c) {
            prev = i;
        }
        result[i] = i - prev;
    }
    
    // Second pass - right to left
    prev = INT_MAX;
    for(int i = len - 1; i >= 0; i--) {
        if (s[i] == c) {
            prev = i;
        }
        result[i] = (result[i] < prev - i) ? result[i] : prev - i;
    }
    return result;
}
using System;

public class Solution {
    public int[] ShortestToChar(string s, char c) {
        int n = s.Length;
        int[] result = new int[n];
        int prev = -n;
        
        // Forward pass
        for (int i = 0; i < n; i++) {
            if (s[i] == c) prev = i;
            result[i] = i - prev;
        }
        
        // Backward pass
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] == c) prev = i;
            result[i] = Math.Min(result[i], Math.Abs(i - prev));
        }
        return result;
    }
}

The Python solution initializes a result list of same length as s to store shortest distances. It computes distances moving from left to right, and corrects them while moving from right to left using the minimum distance found from a c on the right.

Complexity

Time Complexity: O(n) as we iterate through the string twice, adjusting distances for each character.

Space Complexity: O(n) for the storage of the result list.

Try this approach in the editor

Approach 2: Default Approach

function shortestToChar(s: string, c: string): number[] {
    const n = s.length;
    const inf = 1 << 30;
    const ans: number[] = new Array(n).fill(inf);
    for (let i = 0, pre = -inf; i < n; ++i) {
        if (s[i] === c) {
            pre = i;
        }
        ans[i] = i - pre;
    }
    for (let i = n - 1, suf = inf; i >= 0; --i) {
        if (s[i] === c) {
            suf = i;
        }
        ans[i] = Math.min(ans[i], suf - i);
    }
    return ans;
}
func shortestToChar(s string, c byte) []int {
	n := len(s)
	ans := make([]int, n)
	const inf int = 1 << 30
	pre := -inf
	for i := range s {
		if s[i] == c {
			pre = i
		}
		ans[i] = i - pre
	}
	suf := inf
	for i := n - 1; i >= 0; i-- {
		if s[i] == c {
			suf = i
		}
		ans[i] = min(ans[i], suf-i)
	}
	return ans
}
impl Solution {
    pub fn shortest_to_char(s: String, c: char) -> Vec<i32> {
        let c = c as u8;
        let s = s.as_bytes();
        let n = s.len();
        let mut res = vec![i32::MAX; n];
        let mut pre = i32::MAX;
        for i in 0..n {
            if s[i] == c {
                pre = i as i32;
            }
            res[i] = i32::abs((i as i32) - pre);
        }
        pre = i32::MAX;
        for i in (0..n).rev() {
            if s[i] == c {
                pre = i as i32;
            }
            res[i] = res[i].min(i32::abs((i as i32) - pre));
        }
        res
    }
}
Try this approach in the editor

Complexity comparison

ApproachComplexity
Two Pass Approach

Time Complexity: O(n) as we iterate through the string twice, adjusting distances for each character.

Space Complexity: O(n) for the storage of the result list.

Default Approach–

Complexity analysis

ApproachTimeSpaceWhen to Use
Brute Force ScanO(n^2)O(n)Conceptual baseline or when explaining the naive solution first in interviews
Two Pass ApproachO(n)O(n)Optimal solution for production and coding interviews

Frequently asked questions

Is Shortest Distance to a Character easy or hard?

Shortest Distance to a Character is classified as an Easy problem. The challenge is recognizing that the nearest target can come from either direction and solving it efficiently using two linear passes instead of repeated searches.

Shortest Distance to a Character Python/Java solution

The typical Python or Java implementation uses an integer array for results and two loops across the string. Each loop tracks the nearest occurrence of the target character and updates the minimum distance in O(n) time.

How to solve Shortest Distance to a Character in O(n)?

Perform two passes over the string. During the first pass (left to right), track the most recent index of the target character and compute the distance for each position. During the second pass (right to left), track the nearest occurrence on the right and update each index using the minimum of the two distances.

What is the best approach for Shortest Distance to a Character?

The two-pass linear scan is the best approach. Scan the string from left to right to compute distances from the closest left occurrence of the target character, then scan from right to left to update distances using the nearest right occurrence. This guarantees the minimum distance in O(n) time and O(n) space.

Is Shortest Distance to a Character asked at Google/Amazon/Meta?

Variants of nearest-element or distance-to-target problems appear in interviews at companies like Amazon, Google, and Meta. They test your ability to optimize from a brute-force scan to a linear-time directional pass solution.

What data structure is used in Shortest Distance to a Character?

The problem mainly uses an array to store distances and simple integer variables to track the last seen index of the target character. The algorithm relies on sequential scans rather than complex data structures.

What is the time complexity of Shortest Distance to a Character?

The optimal solution runs in O(n) time where n is the length of the string. The algorithm performs two linear passes over the string. Space complexity is O(n) for the output distance array.

Comments

Now write it yourselfClose this page and solve Shortest Distance to a Character in the editor, without looking.
Practise Shortest Distance to a Character