Given a string S and a character X where , for some
. The task is to return an array of distances representing the shortest distance from the character X to every other character in the string.
Examples:
Input: S = “geeksforgeeks”, X = ‘e’
Output: [1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2]
for S[0] = ‘g’ nearest ‘e’ is at distance = 1 i.e. S[1] = ‘e’.
similarly, for S[1] = ‘e’, distance = 0.
for S[6] = ‘o’, distance = 3 since we have S[9] = ‘e’, and so on.Input: S = “helloworld”, X = ‘o’
Output: [4, 3, 2, 1, 0, 1, 0, 1, 2, 3]
Approach: For each character at index i in S[], let us try to find the distance to the next character X going left to right, and from right to left. The answer will be the minimum of these two values.
- When going from left to right, we remember the index of the last character X we’ve seen. Then the answer is i – prev.
- When going from right to left, the answer is prev – i.
- We take the minimum of these two answers to create our final distance array.
- Finally, print the array.
Below is the implementation of above approach:
C++
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std; // Function to return required // array of distances void shortestDistance(string S, char X) { // Find distance from occurrences of X // appearing before current character. int prev = INT_MAX; vector< int > ans; for ( int i = 0; i < S.length(); i++) { if (S[i] == X) prev = i; if (prev == INT_MAX) ans.push_back(INT_MAX); else ans.push_back(i - prev); } // Find distance from occurrences of X // appearing after current character and // compare this distance with earlier. prev = INT_MAX; for ( int i = S.length() - 1; i >= 0; i--) { if (S[i] == X) prev = i; if (prev != INT_MAX) ans[i] = min(ans[i], prev - i); } for ( auto val: ans) cout << val << ' ' ; } // Driver code int main() { string S = "helloworld" ; char X = 'o' ; shortestDistance(S, X); return 0; } // This code is contributed by Rituraj Jain |
Java
// Java implementation of above approach import java.util.*; class GFG { // Function to return required // array of distances static void shortestDistance(String S, char X) { // Find distance from occurrences of X // appearing before current character. int prev = Integer.MAX_VALUE; Vector<Integer> ans = new Vector<>(); for ( int i = 0 ; i < S.length(); i++) { if (S.charAt(i) == X) prev = i; if (prev == Integer.MAX_VALUE) ans.add(Integer.MAX_VALUE); else ans.add(i - prev); } // Find distance from occurrences of X // appearing after current character and // compare this distance with earlier. prev = Integer.MAX_VALUE; for ( int i = S.length() - 1 ; i >= 0 ; i--) { if (S.charAt(i) == X) prev = i; if (prev != Integer.MAX_VALUE) ans.set(i, Math.min(ans.get(i), prev - i)); } for (Integer val: ans) System.out.print(val+ " " ); } // Driver code public static void main(String[] args) { String S = "geeksforgeeks" ; char X = 'g' ; shortestDistance(S, X); } } // This code is contributed by Rajput-Ji |
Python3
# Python3 implementation of above approach # Function to return required # array of distances def shortestDistance(S, X): # Find distance from occurrences of X # appearing before current character. inf = float ( 'inf' ) prev = inf ans = [] for i,j in enumerate (S): if S[i] = = X: prev = i if (prev = = inf) : ans.append(inf) else : ans.append(i - prev) # Find distance from occurrences of X # appearing after current character and # compare this distance with earlier. prev = inf for i in range ( len (S) - 1 , - 1 , - 1 ): if S[i] = = X: prev = i if (X ! = inf): ans[i] = min (ans[i], prev - i) # return array of distance return ans # Driver code S = "geeksforgeeks" X = "g" # Function call to print answer print (shortestDistance(S, X)) |
C#
// C# implementation of above approach using System; using System.Collections.Generic; class GFG { // Function to return required // array of distances public static void shortestDistance(String S, char X){ // Find distance from occurrences of X // appearing before current character. int prev = int .MaxValue; List< int > ans = new List< int >(); for ( int i=0; i<S.Length; i++) { if (S[i] == X) prev = i; if (prev == int .MaxValue) ans.Add( int .MaxValue); else ans.Add(i-prev); } // Find distance from occurrences of X // appearing after current character and // compare this distance with earlier. prev = int .MaxValue; for ( int i=S.Length-1; i>=0; i--) { if (S[i] == X) prev = i; if (prev != int .MaxValue) ans[i] = Math.Min(ans[i], prev-i); } foreach ( var i in ans) Console.Write(i + " " ); } // Driver code public static void Main(String[] args) { String S = "geeksforgeeks" ; char X = 'g' ; shortestDistance(S, X); } } // This code is contributed by // sanjeev2552 |
[0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4]
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.