Given a string, find the repeated character present first in the string.
Input : geeksforgeeks Output : g (mind that it will be g, not e.) Input : abcdabcd Output : a Input : abcd Output : -1 No character repeats
Asked in: Goldman Sachs internship
We have discussed different approaches in Find repeated character present first in a string.
How to solve this problem using one traversal of input string?
Method 1 (Traversing from Left to Right) We traverse the string from left to right. We keep track of the leftmost index of every character. If a character repeats, we compare its leftmsot index with current result and update the result if result is greater
C++
// CPP program to find first repeating // character #include <bits/stdc++.h> using namespace std; #define NO_OF_CHARS 256 /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ int firstRepeating(string& str) { // Initialize leftmost index of every // character as -1. int firstIndex[NO_OF_CHARS]; for ( int i = 0; i < NO_OF_CHARS; i++) firstIndex[i] = -1; // Traverse from left and update result // if we see a repeating character whose // first index is smaller than current // result. int res = INT_MAX; for ( int i = 0; i < str.length(); i++) { if (firstIndex[str[i]] == -1) firstIndex[str[i]] = i; else res = min(res, firstIndex[str[i]]); } return (res == INT_MAX) ? -1 : res; } /* Driver program to test above function */ int main() { string str = "geeksforgeeks" ; int index = firstRepeating(str); if (index == -1) printf ( "Either all characters are " "distinct or string is empty" ); else printf ( "First Repeating character" " is %c" , str[index]); return 0; } |
Java
// Java program to find first repeating // character class GFG { static int NO_OF_CHARS = 256 ; /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ static int firstRepeating( char [] str) { // Initialize leftmost index of every // character as -1. int [] firstIndex = new int [NO_OF_CHARS]; for ( int i = 0 ; i < NO_OF_CHARS; i++) { firstIndex[i] = - 1 ; } // Traverse from left and update result // if we see a repeating character whose // first index is smaller than current // result. int res = Integer.MAX_VALUE; for ( int i = 0 ; i < str.length; i++) { if (firstIndex[str[i]] == - 1 ) { firstIndex[str[i]] = i; } else { res = Math.min(res, firstIndex[str[i]]); } } return (res == Integer.MAX_VALUE) ? - 1 : res; } /* Driver code */ public static void main(String[] args) { char [] str = "geeksforgeeks" .toCharArray(); int index = firstRepeating(str); if (index == - 1 ) { System.out.printf( "Either all characters are " + "distinct or string is empty" ); } else { System.out.printf( "First Repeating character" + " is %c" , str[index]); } } } // This code has been contributed by 29AjayKumar |
Python3
# Python 3 program to find first repeating # character import sys NO_OF_CHARS = 256 # The function returns index of the first # repeating character in a string. If # all characters are repeating then # returns -1 */ def firstRepeating( str ): # Initialize leftmost index of every # character as -1. firstIndex = [ 0 for i in range (NO_OF_CHARS)] for i in range (NO_OF_CHARS): firstIndex[i] = - 1 # Traverse from left and update result # if we see a repeating character whose # first index is smaller than current # result. res = sys.maxsize for i in range ( len ( str )): if (firstIndex[ ord ( str [i])] = = - 1 ): firstIndex[ ord ( str [i])] = i else : res = min (res, firstIndex[ ord ( str [i])]) if res = = sys.maxsize: return - 1 else : return res # Driver function if __name__ = = '__main__' : str = "geeksforgeeks" index = firstRepeating( str ) if (index = = - 1 ): print ( "Either all characters are distinct or string is empty" ) else : print ( "First Repeating character is" , str [index]) # This code is contributed by # Surendra_Gangwar |
C#
// C# program to find first repeating // character using System; using System.Collections.Generic; class GFG { static int NO_OF_CHARS = 256; /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ static int firstRepeating( char [] str) { // Initialize leftmost index of every // character as -1. int [] firstIndex = new int [NO_OF_CHARS]; for ( int i = 0; i < NO_OF_CHARS; i++) { firstIndex[i] = -1; } // Traverse from left and update result // if we see a repeating character whose // first index is smaller than current // result. int res = int .MaxValue; for ( int i = 0; i < str.Length; i++) { if (firstIndex[str[i]] == -1) { firstIndex[str[i]] = i; } else { res = Math.Min(res, firstIndex[str[i]]); } } return (res == int .MaxValue) ? -1 : res; } /* Driver code */ public static void Main(String[] args) { char [] str = "geeksforgeeks" .ToCharArray(); int index = firstRepeating(str); if (index == -1) { Console.Write( "Either all characters are " + "distinct or string is empty" ); } else { Console.Write( "First Repeating character" + " is {0}" , str[index]); } } } // This code is contributed by Princi Singh |
First Repeating character is g
Time Complexity : O(n). It does only one traversal of input string.
Auxiliary Space : O(1)
Method 2 (Traversing Right to Left) We traverse the string from right to left. We keep track of the visited characters. If a character repeats, we update the result.
C++
// CPP program to find first repeating // character #include <bits/stdc++.h> using namespace std; #define NO_OF_CHARS 256 /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ int firstRepeating(string& str) { // Mark all characters as not visited bool visited[NO_OF_CHARS]; for ( int i = 0; i < NO_OF_CHARS; i++) visited[i] = false ; // Traverse from right and update res as soon // as we see a visited character. int res = -1; for ( int i = str.length() - 1; i >= 0; i--) { if (visited[str[i]] == false ) visited[str[i]] = true ; else res = i; } return res; } /* Driver program to test above function */ int main() { string str = "geeksforgeeks" ; int index = firstRepeating(str); if (index == -1) printf ( "Either all characters are " "distinct or string is empty" ); else printf ( "First Repeating character" " is %c" , str[index]); return 0; } |
Java
// Java program to find first repeating // character import java.util.*; class GFG { static int NO_OF_CHARS= 256 ; /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ static int firstRepeating(String str) { // Mark all characters as not visited boolean []visited = new boolean [NO_OF_CHARS]; for ( int i = 0 ; i < NO_OF_CHARS; i++) visited[i] = false ; // Traverse from right and update res as soon // as we see a visited character. int res = - 1 ; for ( int i = str.length() - 1 ; i >= 0 ; i--) { if (visited[str.charAt(i)] == false ) visited[str.charAt(i)] = true ; else res = i; } return res; } /* Driver code */ public static void main(String[] args) { String str = "geeksforgeeks" ; int index = firstRepeating(str); if (index == - 1 ) System.out.printf( "Either all characters are " + "distinct or string is empty" ); else System.out.printf( "First Repeating character" + " is %c" , str.charAt(index)); } } // This code contributed by Rajput-Ji |
Python3
# Python3 program to find first # repeating character NO_OF_CHARS = 256 """ The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 """ def firstRepeating(string) : # Mark all characters as not visited visited = [ False ] * NO_OF_CHARS; for i in range (NO_OF_CHARS) : visited[i] = False ; # Traverse from right and update res as soon # as we see a visited character. res = - 1 ; for i in range ( len (string) - 1 , - 1 , - 1 ) : if (visited[string.index(string[i])] = = False ): visited[string.index(string[i])] = True ; else : res = i; return res; # Driver program to test above function if __name__ = = "__main__" : string = "geeksforgeeks" ; index = firstRepeating(string); if (index = = - 1 ) : print ( "Either all characters are" , "distinct or string is empty" ); else : print ( "First Repeating character is:" , string[index]); # This code is contributed by AnkitRai01 |
C#
// C# program to find first repeating // character using System; class GFG { static int NO_OF_CHARS = 256; /* The function returns index of the first repeating character in a string. If all characters are repeating then returns -1 */ static int firstRepeating(String str) { // Mark all characters as not visited Boolean []visited = new Boolean[NO_OF_CHARS]; for ( int i = 0; i < NO_OF_CHARS; i++) visited[i] = false ; // Traverse from right and update res as soon // as we see a visited character. int res = -1; for ( int i = str.Length - 1; i >= 0; i--) { if (visited[str[i]] == false ) visited[str[i]] = true ; else res = i; } return res; } // Driver Code public static void Main(String[] args) { String str = "geeksforgeeks" ; int index = firstRepeating(str); if (index == -1) Console.Write( "Either all characters are " + "distinct or string is empty" ); else Console.Write( "First Repeating character" + " is {0}" , str[index]); } } // This code is contributed by PrinciRaj1992 |
First Repeating character is g
Time Complexity : O(n). It does only one traversal of input string.
Auxiliary Space : O(1)
The method 2 is better than method 1 as it does fewer comparisons.
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.