Repeated Character Whose First Appearance is Leftmost

Given a string, find the repeated character present first in the string.


Examples:

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output:

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 

chevron_right


Output:

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.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.