Ordene la array de strings según el orden alfabético definido por otra string

Dada una string str y una array de strings strArr[] , la tarea es ordenar la array según el orden alfabético definido por str
Nota: str y cada string en strArr[] consta solo de alfabetos en minúsculas.
Ejemplos: 

Entrada: str = “fguecbdavwyxzhijklmnopqrst”, 
strArr[] = {“geeksforgeeks”, “es”, “el”, “mejor”, “lugar”, “para”, “aprendizaje”} 
Salida: para los geeksforgeeks lo mejor es el lugar de aprendizaje
Entrada: str = “avdfghiwyxzjkecbmnopqrstul”, 
strArr[] = {“arco iris”, “consiste”, “de”, “colores”} 
Salida: consiste en los colores del arco iris 

Enfoque: recorra cada carácter de str y almacene el valor en un mapa con carácter como clave y su índice en la array como valor
Ahora, este mapa actuará como el nuevo orden alfabético de los personajes. Comience a comparar la string en strArr[] y, en lugar de comparar los valores ASCII de los caracteres, compare los valores asignados a esos caracteres particulares en el mapa, es decir, si el carácter c1 aparece antes que el carácter c2 en str , entonces c1 < c2 .
A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Map to store the characters with their order
// in the new alphabetical order
unordered_map<char, int> h;
 
// Function that returns true if x < y
// according to the new alphabetical order
bool compare(string x, string y)
{
    for (int i = 0; i < min(x.size(), y.size()); i++) {
        if (h[x[i]] == h[y[i]])
            continue;
        return h[x[i]] < h[y[i]];
    }
    return x.size() < y.size();
}
 
// Driver code
int main()
{
    string str = "fguecbdavwyxzhijklmnopqrst";
    vector<string> v{ "geeksforgeeks", "is", "the",
                      "best", "place", "for", "learning" };
 
    // Store the order for each character
    // in the new alphabetical sequence
    h.clear();
    for (int i = 0; i < str.size(); i++)
        h[str[i]] = i;   
 
    sort(v.begin(), v.end(), compare);
 
    // Print the strings after sorting
    for (auto x : v)
        cout << x << " ";
     
    return 0;
}

Java

// Java implementation of the approach
import java.util.Arrays;
import java.util.Comparator;
 
public class GFG
{
private static void sort(String[] strArr, String str)
{
    Comparator<String> myComp = new Comparator<String>()
    {
        @Override
        public int compare(String a, String b)
        {
            for(int i = 0;
                    i < Math.min(a.length(),
                                 b.length()); i++)
            {
                if (str.indexOf(a.charAt(i)) ==
                    str.indexOf(b.charAt(i)))
                {
                    continue;
                }
                else if(str.indexOf(a.charAt(i)) >
                        str.indexOf(b.charAt(i)))
                {
                    return 1;
                }
                else
                {
                    return -1;
                }
            }
            return 0;
        }
    };
    Arrays.sort(strArr, myComp);
}
 
// Driver Code
public static void main(String[] args)
{
    String str = "fguecbdavwyxzhijklmnopqrst";
    String[] strArr = {"geeksforgeeks", "is", "the", "best",
                       "place", "for", "learning"};
     
    sort(strArr, str);
 
    for(int i = 0; i < strArr.length; i++)
    {
        System.out.print(strArr[i] + " ");
    }
}
}

Python3

# Python3 implementation of the approach
 
# Function to sort and print the array
# according to the new alphabetical order
def sortStringArray(s, a, n):
     
    # Sort the array according to the new alphabetical order
    a = sorted(a, key = lambda word: [s.index(c) for c in word])
    for i in a:
        print(i, end =' ')
 
# Driver code
s = "fguecbdavwyxzhijklmnopqrst"
a = ["geeksforgeeks", "is", "the", "best", "place", "for", "learning"]
n = len(a)
sortStringArray(s, a, n)

Javascript

<script>
 
// JavaScript implementation of the approach
 
// Map to store the characters with their order
// in the new alphabetical order
let h = new Map();
 
// Function that returns true if x < y
// according to the new alphabetical order
function compare(x, y)
{
    for (let i = 0; i < Math.min(x.length, y.length); i++) {
        if (h.get(x[i]) == h.get(y[i]))
            continue;
        return h.get(x[i]) - h.get(y[i]);
    }
    return x.length - y.length;
}
 
// Driver code
let str = "fguecbdavwyxzhijklmnopqrst";
let v = [ "geeksforgeeks", "is", "the","best", "place", "for", "learning" ];
 
// Store the order for each character
// in the new alphabetical sequence
h.clear();
for (let i = 0; i < str.length; i++)
    h.set(str[i],i);
 
v.sort(compare);
 
// Print the strings after sorting
for (let x of v)
    document.write(x + " ");
 
// This code is contributed by shinjanpatra
</script>
Producción: 

for geeksforgeeks best is learning place the

 

Complejidad de tiempo: O(N * log(N)), donde N es el tamaño de la string str

Espacio Auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por Lohith sai Andra 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 *