📜  首次出现在最左边的重复字符

📅  最后修改于: 2021-05-04 12:47:14             🧑  作者: Mango

给定一个字符串,首先字符串中找到重复的字符存在。


例子:

Input  : geeksforgeeks
Output : g
(mind that it will be g, not e.)

Input  : abcdabcd
Output : a

Input  : abcd
Output : -1
No character repeats

询问:高盛实习

我们已经在查找字符串首先出现的重复字符讨论了不同的方法。

如何使用输入字符串的遍历解决此问题?


方法1(从左到右
遍历)我们从左到右遍历字符串。我们跟踪每个字符的最左边的索引。如果一个字符重复,我们将其leftmsot索引与当前结果进行比较,如果结果更大,则更新结果

C++
// CPP program to find first repeating
// character
#include 
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


C++
// CPP program to find first repeating
// character
#include 
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

时间复杂度:O(n)。它只对输入字符串一次遍历。
辅助空间:O(1)


方法2(从右到左遍历)
我们从右到左遍历字符串。我们跟踪拜访的字符。如果一个字符重复,我们将更新结果。

C++

// CPP program to find first repeating
// character
#include 
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

时间复杂度: O(n)。它只对输入字符串一次遍历。
辅助空间: O(1)

方法2比方法1更好,因为它进行的比较较少。