Encuentre el carácter distinto Kth desde el inicio de la string dada

Dada una string str de tamaño N que contiene todos los caracteres posibles, incluidos los números enteros. Imprime Kth carácter distinto desde el comienzo de la string dada. Si K es más que el número de caracteres distintos, imprima -1 .

Nota:Las letras mayúsculas y minúsculas se consideran diferentes.

Ejemplos:

Entrada: str = “prophet1999”, K = 4
Salida: h
Explicación: El primer carácter distinto es ‘p’.
El segundo carácter distinto es ‘r’.
El tercer carácter distinto es ‘o’.
El cuarto carácter distinto es ‘h’.
‘p’ no es el cuarto carácter porque ya está presente antes de este punto y no es distinto.

Entrada: str = “GeeksForGeeks”, K = 2
Salida: e
Explicación: El primer carácter distintivo es ‘G’.
El segundo carácter distinto es ‘e’.

 

Enfoque ingenuo: una solución simple es utilizar dos bucles anidados en los que el bucle exterior elige los caracteres de izquierda a derecha y el bucle interior comprueba si el carácter seleccionado está presente en otro lugar y lo convierte en el carácter nulo ‘\0’. Si el i-ésimo elemento no es ‘\0’, entonces incremente el conteo de elementos distintos . Si el recuento de elementos distintos se convierte en K , devuelve el elemento actual.

 A continuación se muestra la implementación del enfoque anterior.

C++14

// C++ program to implement above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the Kth distinct character
int printKDistinct(string& str, int& K)
{
    int distinct = 0, i, j, N = str.length();
 
    if (K <= 0)
        return -1;
 
    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++) {
            if (str[i] == str[j])
                str[j] = '\0';
        }
        if (str[i] != '\0')
            distinct++;
        if (distinct == K)
            return str[i];
    }
    return -1;
}
 
// Driver code
int main()
{
    string str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str, K);
    if (ans == -1)
        cout << -1;
    else
        cout << (char)ans;
    return 0;
}

Java

// Java code to implement the approach
import java.io.*;
import java.util.*;
 
class GFG {
    // Function to print the Kth distinct character
    static int printKDistinct(char[] str, int K)
    {
        int distinct = 0, i, j, N = str.length;
 
        if (K <= 0)
            return -1;
 
        for (i = 0; i < N; i++) {
            for (j = i + 1; j < N; j++) {
                if (str[i] == str[j])
                    str[j] = '\0';
            }
            if (str[i] != '\0')
                distinct++;
            if (distinct == K)
                return str[i];
        }
        return -1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "GeeksForGeeks";
        int K = 2;
        int ans = printKDistinct(str.toCharArray(), K);
        if (ans == -1)
            System.out.println(-1);
        else
            System.out.println((char)ans);
    }
}
// This code is contributed by Karandeep1234

Python3

# Python program to implement above approach
 
# Function to print the Kth distinct character
def printKDistinct(Str, K):
    distinct,N = 0 ,len(Str)
 
    if (K <= 0):
        return -1
 
    for i in range(N):
        for j in range(i + 1,N):
            if (Str[i] == Str[j]):
                Str.replace(Str[j],'\0')
        if (Str[i] != '\0'):
            distinct += 1
        if (distinct == K):
            return Str[i]
    return -1
 
# Driver code
Str = "GeeksForGeeks"
K = 2
ans = printKDistinct(Str, K)
if (ans == -1):
    print(-1)
else:
    print(ans)
     
# This code is contributed by shinjanpatra

C#

// C# code to implement the approach
using System;
 
public class GFG
{
   
  // Function to print the Kth distinct character
  static int printKDistinct(char[] str, int K)
  {
    int distinct = 0, i, j, N = str.Length;
 
    if (K <= 0)
      return -1;
 
    for (i = 0; i < N; i++) {
      for (j = i + 1; j < N; j++) {
        if (str[i] == str[j])
          str[j] = '\0';
      }
      if (str[i] != '\0')
        distinct++;
      if (distinct == K)
        return str[i];
    }
    return -1;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    String str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str.ToCharArray(), K);
    if (ans == -1)
      Console.WriteLine(-1);
    else
      Console.WriteLine((char)ans);
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
// Javascript program to implement above approach
 
// Function to print the Kth distinct character
function printKDistinct(str, K) {
    let distinct = 0, i, j, N = str.length;
 
    if (K <= 0)
        return -1;
 
    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++) {
            if (str[i] == str[j])
                str[j] = '\0';
        }
        if (str[i] != '\0')
            distinct++;
        if (distinct == K)
            return str[i];
    }
    return -1;
}
 
// Driver code
let str = "GeeksForGeeks";
let K = 2;
let ans = printKDistinct(str, K);
if (ans == -1)
    document.write(-1);
else
    document.write(ans);
     
    // This code is contributed by saurabh_jaiswal.
</script>
Producción

e

Complejidad temporal: O(N * N)
Espacio auxiliar: O(1)

Uso de conjuntos: un enfoque eficiente es usar conjuntos para almacenar caracteres recorriendo la string dada y verificando su tamaño en cada iteración. Si su tamaño se vuelve igual a K , devuelve el carácter actual. De lo contrario, K es mayor que el número de caracteres distintos presentes en la string, por lo que devuelve -1 .

A continuación se muestra la implementación del enfoque anterior.

C++14

// C++ program to implement the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the Kth distinct character
int printKDistinct(string& str, int& K)
{
    set<int> unique;
    int N = str.length();
 
    for (int i = 0; i < N; i++) {
        unique.insert(str[i]);
        if (unique.size() == K)
            return str[i];
    }
    return -1;
}
 
// Driver code
int main()
{
    string str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str, K);
    if (ans == -1)
        cout << -1;
    else
        cout << (char)ans;
    return 0;
}

Java

// Java code to implement the approach
import java.io.*;
import java.util.*;
 
class GFG
{
  // Function to print the Kth distinct character
  static int printKDistinct(String str, int K)
  {
    HashSet<Character> unique = new HashSet<>();
    int N = str.length();
 
    for (int i = 0; i < N; i++) {
      unique.add(str.charAt(i));
      if (unique.size() == K)
        return str.charAt(i);
    }
    return -1;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    String str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str, K);
    if (ans == -1)
      System.out.println(-1);
    else
      System.out.println((char)ans);
  }
}
 
// This code is contributed by Karandeep1234

Python3

# Python 3 program to implement the approach
 
# Function to print the Kth distinct character
def printKDistinct(st,  K):
 
    unique = set([])
    N = len(st)
 
    for i in range(N):
        unique.add(st[i])
        if (len(unique) == K):
            return st[i]
 
    return -1
 
# Driver code
if __name__ == "__main__":
 
    st = "GeeksForGeeks"
    K = 2
    ans = printKDistinct(st, K)
    if (ans == -1):
        print(-1)
    else:
        print(ans)
 
        # This code is contributed by ukasp.

C#

// C# code to implement the approach
 
using System;
using System.Collections.Generic;
 
public class GFG
{
  // Function to print the Kth distinct character
  static int printKDistinct(String str, int K)
  {
    HashSet<char> unique = new HashSet<char>();
    int N = str.Length;
 
    for (int i = 0; i < N; i++) {
      unique.Add(str[i]);
      if (unique.Count == K)
        return str[i];
    }
    return -1;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    String str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str, K);
    if (ans == -1)
      Console.WriteLine(-1);
    else
      Console.WriteLine((char)ans);
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
        // JavaScript code for the above approach
 
        // Function to print the Kth distinct character
        function printKDistinct(str, K) {
            let unique = new Set();
            let N = str.length;
 
            for (let i = 0; i < N; i++) {
                unique.add(str[i]);
                if (unique.size == K)
                    return str[i];
            }
            return -1;
        }
 
        // Driver code
        let str = "GeeksForGeeks";
        let K = 2;
        let ans = printKDistinct(str, K);
        if (ans == -1)
            document.write(-1);
        else
            document.write(ans);
 
       // This code is contributed by Potta Lokesh
    </script>
Producción

e

Complejidad temporal: O(N * logN)
Espacio auxiliar: O(N)

Usando Hash-Mapa:Otra solución eficiente es usar Hashing . Siga los pasos que se mencionan a continuación:

  • Cree una tabla hash vacía .
  • Atraviese la string de entrada de izquierda a derecha y verifique si el carácter actual está presente en el mapa o no.
  • Si no está presente en el mapa, incremente distinto .
  • Si distinto se convierte en K , devuelve el carácter actual.
  • Si K es mayor que el número de caracteres distintos presentes en la string, devuelve -1 .

A continuación se muestra la implementación del enfoque anterior.

C++14

// C++ program to implement the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the Kth distinct character
int printKDistinct(string& str, int& K)
{
    int distinct = 0, N = str.length();
    unordered_map<char, bool> freq;
 
    for (int i = 0; i < N; i++) {
        if (!freq[str[i]])
            distinct++;
        freq[str[i]] = 1;
        if (distinct == K)
            return str[i];
    }
    return -1;
}
 
// Driver code
int main()
{
    string str = "GeeksForGeeks";
    int K = 2;
    int ans = printKDistinct(str, K);
    if (ans == -1)
        cout << -1;
    else
        cout << (char)ans;
    return 0;
}

Python3

# Python program to implement the approach
 
# Function to print the Kth distinct character
def printKDistinct(Str, K):
    distinct,N = 0,len(Str)
    freq = dict()
 
    for i in range(N):
        if (Str[i] not in freq):
            distinct += 1
            freq[Str[i]] = 1
        if (distinct == K):
            return Str[i]
    return -1
 
# Driver code
Str = "GeeksForGeeks"
K = 2
ans = printKDistinct(Str, K)
if (ans == -1):
    print(-1)
else:
    print(ans)
 
# This code is contributed by shinjanpatra

Javascript

<script>
    // JavaScript program to implement the approach
 
    // Function to print the Kth distinct character
    const printKDistinct = (str, K) => {
        let distinct = 0, N = str.length;
        let freq = {};
 
        for (let i = 0; i < N; i++) {
            if (!freq[str[i]])
                distinct++;
            freq[str[i]] = 1;
            if (distinct == K)
                return str[i];
        }
        return -1;
    }
 
    // Driver code
 
    let str = "GeeksForGeeks";
    let K = 2;
    let ans = printKDistinct(str, K);
    if (ans == -1)
        document.write(-1);
    else
        document.write(ans);
 
// This code is contributed by rakeshsahni
 
</script>
Producción

e

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por prophet1999 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 *