Encuentre eficientemente el primer carácter repetido en una string sin usar ninguna estructura de datos adicional en un recorrido

Implemente un algoritmo eficiente en el espacio para verificar el primer carácter repetido en una string sin usar ninguna estructura de datos adicional en un recorrido. No se permite el uso de estructuras de datos adicionales como array de conteo, hash, etc.

Ejemplos: 

Input :  abcfdeacf
Output : char = a, index= 6

La idea es usar una variable entera y usa bits en su representación binaria para almacenar si un carácter está presente o no. Por lo general, un número entero tiene al menos 32 bits y necesitamos almacenar presencia/ausencia de solo 26 caracteres.

Implementación:

C++

// Efficiently check First repeated character
// in C++ program
#include<bits/stdc++.h>
using namespace std;
 
// Returns -1 if all characters of str are
// unique.
// Assumptions : (1) str contains only characters
//                 from 'a' to 'z'
//             (2) integers are stored using 32
//                 bits
int FirstRepeated(string str)
{
    // An integer to store presence/absence
    // of 26 characters using its 32 bits.
    int checker = 0;
 
    for (int i = 0; i < str.length(); ++i)
    {
        int val = (str[i]-'a');
 
        // If bit corresponding to current
        // character is already set
        if ((checker & (1 << val)) > 0)
            return i;
 
        // set bit in checker
        checker |= (1 << val);
    }
 
    return -1;
}
 
// Driver code
int main()
{
    string s = "abcfdeacf";
    int i=FirstRepeated(s);
    if (i!=-1)
        cout <<"Char = "<< s[i] << "   and Index = "<<i;
    else
        cout << "No repeated Char";
    return 0;
}

Java

// Efficiently check First repeated character
// in Java program
public class First_Repeated_char {
 
    static int FirstRepeated(String str)
    {
        // An integer to store presence/absence
        // of 26 characters using its 32 bits.
        int checker = 0;
      
        for (int i = 0; i < str.length(); ++i)
        {
            int val = (str.charAt(i)-'a');
      
            // If bit corresponding to current
            // character is already set
            if ((checker & (1 << val)) > 0)
                return i;
      
            // set bit in checker
            checker |= (1 << val);
        }
      
        return -1;
    }
      
    // Driver code
    public static void main(String args[])
    {
        String s = "abcfdeacf";
        int i=FirstRepeated(s);
        if (i!=-1)
           System.out.println("Char = "+ s.charAt(i) + "   and Index = "+i);
        else
            System.out.println( "No repeated Char");
    }
}
// This code is contributed by Sumit Ghosh

Python3

# Efficiently check First repeated character
# in Python
 
# Returns -1 if all characters of str are
# unique.
# Assumptions : (1) str contains only characters
#                 from 'a' to 'z'
##             (2) integers are stored using 32
##                 bits
def FirstRepeated(string):
     
    # An integer to store presence/absence
    # of 26 characters using its 32 bits.
    checker = 0
  
    pos = 0
    for i in string:
        val = ord(i) - ord('a');
  
        # If bit corresponding to current
        # character is already set
        if ((checker & (1 << val)) > 0):
            return pos
  
        # set bit in checker
        checker |= (1 << val)
        pos += 1
  
    return -1
  
# Driver code
string = "abcfdeacf"
i = FirstRepeated(string)
if i != -1:
    print ("Char = ", string[i], " and Index = ", i)
else:
    print ("No repeated Char")
 
# This code is contributed by Sachin Bisht

C#

// C# program to Efficiently
// check First repeated character
using System;
 
public class First_Repeated_char {
 
    static int FirstRepeated(string str)
    {
        // An integer to store presence/absence
        // of 26 characters using its 32 bits.
        int checker = 0;
     
        for (int i = 0; i < str.Length; ++i)
        {
            int val = (str[i]-'a');
     
            // If bit corresponding to current
            // character is already set
            if ((checker & (1 << val)) > 0)
                return i;
     
            // set bit in checker
            checker |= (1 << val);
        }
     
        return -1;
    }
     
    // Driver code
    public static void Main()
    {
        string s = "abcfdeacf";
        int i=FirstRepeated(s);
        if (i!=-1)
           Console.WriteLine("Char = " + s[i] +
                          " and Index = " + i);
        else
            Console.WriteLine( "No repeated Char");
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// Efficiently check First repeated character
// in PHP program
 
// Returns -1 if all characters of str are
// unique.
// Assumptions : (1) str contains only characters
//                     from 'a' to 'z'
//                 (2) integers are stored using 32
//                     bits
function FirstRepeated($str)
{
    // An integer to store presence/absence
    // of 26 characters using its 32 bits.
    $checker = 0;
 
    for ($i = 0; $i < strlen($str); ++$i)
    {
        $val = (ord($str[$i]) - ord('a'));
 
        // If bit corresponding to current
        // character is already set
        if (($checker & (1 << $val)) > 0)
            return $i;
 
        // set bit in checker
        $checker |= (1 << $val);
    }
 
    return -1;
}
 
// Driver code
$s = "abcfdeacf";
$i=FirstRepeated($s);
if ($i!=-1)
    echo "Char = " . $s[$i] .
         " and Index = " . $i;
else
    echo "No repeated Char";
 
// This code is contributed by ita_c
?>

Javascript

<script>
// Efficiently check First repeated character
// in Javascript program
     
    function FirstRepeated(str)
    {
        // An integer to store presence/absence
        // of 26 characters using its 32 bits.
        let checker = 0;
        
        for (let i = 0; i < str.length; ++i)
        {
            let val = (str[i]-'a');
        
            // If bit corresponding to current
            // character is already set
            if ((checker & (1 << val)) > 0)
                return i;
        
            // set bit in checker
            checker |= (1 << val);
        }
        
        return -1;
    }
     
    // Driver code
    let s = "abcfdeacf";
    let i=FirstRepeated(s);
    if (i!=-1)
       document.write("Char = "+ s[i] + " and Index = "+i);
    else
        document.write( "No repeated Char");
     
    // This code is contributed by rag2127
     
</script>
Producción

Char = a   and Index = 6

Complejidad temporal: O(n) 
Espacio auxiliar: O(1)

Este artículo es una contribución del Sr. Somesh Awasthi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *