Búsqueda de prefijo ponderado

Dadas n strings y un peso asociado a cada string. La tarea es encontrar el peso máximo de la string que tiene el prefijo dado. Imprima «-1» si no hay una string presente con el prefijo dado.
Ejemplos: 
 

Input : 
s1 = "geeks", w1 = 15
s2 = "geeksfor", w2 = 30
s3 = "geeksforgeeks", w3 = 45
prefix = geek
Output : 45

All the string contain the given prefix, but
maximum weight of string is 45 among all.

Método 1: (Fuerza bruta)

Verifique toda la string para el prefijo dado, si la string contiene el prefijo, compare su peso con el valor máximo hasta el momento.
A continuación se muestra la implementación de la idea anterior: 
 

C++

// C++ program to find the maximum weight with given prefix.
// Brute Force based C++ program to find the
// string with maximum weight and given prefix.
#include<bits/stdc++.h>
#define MAX 1000
using namespace std;
 
// Return the maximum weight of string having
// given prefix.
int maxWeight(char str[MAX][MAX], int weight[],
                          int n, char prefix[])
{
    int ans = -1;
    bool check;
 
    // Traversing all strings
    for (int i = 0; i < n; i++)
    {
        check = true;
 
        // Checking if string contain given prefix.
        for (int j=0, k=0; j < strlen(str[i]) &&
                           k < strlen(prefix); j++, k++)
        {
            if (str[i][j] != prefix[k])
            {
                check = false;
                break;
            }
        }
 
        // If contain prefix then finding
        // the maximum value.
        if (check)
            ans = max(ans, weight[i]);
    }
 
    return ans;
}
 
// Driven program
int main()
{
    int n = 3;
    char str[3][MAX] = { "geeks", "geeksfor", "geeksforgeeks" };
    int weight[] = {15, 30, 45};
    char prefix[] = "geek";
 
    cout << maxWeight(str, weight, n, prefix) << endl;
 
    return 0;
}

Java

// Java program to find the maximum
// weight with given prefix.
 
class GFG {
    static final int MAX = 1000;
 
    // Return the maximum weight of string having
    // given prefix.
    static int maxWeight(String str[], int weight[],
                              int n, String prefix)
    {
        int ans = -1;
        boolean check;
 
        // Traversing all strings
        for (int i = 0; i < n; i++)
        {
            check = true;
 
            // Checking if string contain given prefix.
            for (int j=0, k=0; j < str[i].length() &&
                               k < prefix.length(); j++, k++)
            {
                if (str[i].charAt(j) != prefix.charAt(k))
                {
                    check = false;
                    break;
                }
            }
 
            // If contain prefix then finding
            // the maximum value.
            if (check)
                ans = Math.max(ans, weight[i]);
        }
 
        return ans;
    }
 
    // Driven program
    public static void main(String args[])
    {
        int n = 3;
        String str[] = { "geeks", "geeksfor", "geeksforgeeks" };
        int weight[] = {15, 30, 45};
        String prefix = "geek";
 
        System.out.println(maxWeight(str, weight, n, prefix));
    }
}
//This code is contributed by Sumit Ghosh

C#

// C# program to find the maximum weight
// with given prefix.
using System;
 
class GFG
{
 
    // Return the maximum weight of
    // string having given prefix.
    static int maxWeight(string []str, int []weight,
                         int n, string prefix)
    {
        int ans = -1;
        bool check;
 
        // Traversing all strings
        for (int i = 0; i < n; i++)
        {
            check = true;
 
            // Checking if string contain given prefix.
            for (int j=0, k=0; j < str[i].Length &&
                     k < prefix.Length; j++, k++)
            {
                if (str[i][j] != prefix[k])
                {
                    check = false;
                    break;
                }
            }
 
            // If contain prefix then finding
            // the maximum value.
            if (check)
                ans = Math.Max(ans, weight[i]);
        }
 
        return ans;
    }
 
    // Driver Code
    public static void Main()
    {
        int n = 3;
        String []str = {"geeks", "geeksfor",
                         "geeksforgeeks"};
        int []weight = {15, 30, 45};
        String prefix = "geek";
 
        Console.WriteLine(maxWeight(str, weight,
                          n, prefix));
    }
}
 
// This code is contributed by vt_m.

Javascript

<script>
    // Javascript program to find the maximum weight with given prefix.
     
    // Return the maximum weight of
    // string having given prefix.
    function maxWeight(str, weight, n, prefix)
    {
        let ans = -1;
        let check;
   
        // Traversing all strings
        for (let i = 0; i < n; i++)
        {
            check = true;
   
            // Checking if string contain given prefix.
            for (let j=0, k=0; j < str[i].length &&
                     k < prefix.length; j++, k++)
            {
                if (str[i][j] != prefix[k])
                {
                    check = false;
                    break;
                }
            }
   
            // If contain prefix then finding
            // the maximum value.
            if (check)
                ans = Math.max(ans, weight[i]);
        }
   
        return ans;
    }
     
    let n = 3;
    let str = ["geeks", "geeksfor", "geeksforgeeks"];
    let weight = [15, 30, 45];
    let prefix = "geek";
 
    document.write(maxWeight(str, weight,
                                n, prefix));
     
</script>

Producción: 
 

45

Método 2 (eficiente):

La idea es crear y mantener un Trie. En lugar del Trie normal donde almacenamos el carácter, almacene un número con él, que es el valor máximo de su prefijo. Cuando volvamos a encontrar el prefijo, actualice el valor con el máximo de uno existente y uno nuevo. 
Ahora, busque el prefijo para el valor máximo, recorra los caracteres comenzando desde la raíz, si falta uno de los caracteres, devuelva -1, de lo contrario, devuelva el número almacenado en la raíz.
A continuación se muestra la implementación de la idea anterior:
 

C++

// C++ program to find the maximum weight
// with given prefix.
#include<bits/stdc++.h>
#define MAX 1000
using namespace std;
 
// Structure of a trie node
struct trieNode
{
    // Pointer its children.
    struct trieNode *children[26];
 
    // To store weight of string.
    int weight;
};
 
// Create and return a Trie node
struct trieNode* getNode()
{
    struct trieNode *node = new trieNode;
    node -> weight = INT_MIN;
 
    for (int i = 0; i < 26; i++)
        node -> children[i] = NULL;
}
 
// Inserting the node in the Trie.
struct trieNode* insert(char str[], int wt, int idx,
                                struct trieNode* root)
{
    int cur = str[idx] - 'a';
 
    if (!root -> children[cur])
        root -> children[cur] = getNode();
 
    // Assigning the maximum weight
    root->children[cur]->weight =
                  max(root->children[cur]->weight, wt);
 
    if (idx + 1 != strlen(str))
        root -> children[cur] =
           insert(str, wt, idx + 1, root -> children[cur]);
 
    return root;
}
 
// Search and return the maximum weight.
int searchMaximum(char prefix[], struct trieNode *root)
{
    int idx = 0, n = strlen(prefix), ans = -1;
 
    // Searching the prefix in TRie.
    while (idx < n)
    {
        int cur = prefix[idx] - 'a';
 
        // If prefix not found return -1.
        if (!root->children[cur])
            return -1;
 
        ans = root->children[cur]->weight;
        root = root->children[cur];
        ++idx;
    }
 
    return ans;
}
 
// Return the maximum weight of string having given prefix.
int maxWeight(char str[MAX][MAX], int weight[], int n,
                                       char prefix[])
{
    struct trieNode* root = getNode();
 
    // Inserting all string in the Trie.
    for (int i = 0; i < n; i++)
        root = insert(str[i], weight[i], 0, root);
 
    return searchMaximum(prefix, root);
 
}
 
// Driven Program
int main()
{
    int n = 3;
    char str[3][MAX] = {"geeks", "geeksfor", "geeksforgeeks"};
    int weight[] = {15, 30, 45};
    char prefix[] = "geek";
 
    cout << maxWeight(str, weight, n, prefix) << endl;
 
    return 0;
}

Java

// Java program to find the maximum weight
// with given prefix.
 
public class GFG{
    static final int MAX = 1000;
     
    // Structure of a trie node
    static class TrieNode
    {
        // children
        TrieNode[] children = new TrieNode[26];
      
        // To store weight of string.
        int weight;
         
        // constructor
        public TrieNode() {
            weight = Integer.MIN_VALUE;
            for (int i = 0; i < 26; i++)
                children[i] = null;
        }
    }
    //static TrieNode root;
     
    // Inserting the node in the Trie.
    static TrieNode insert(String str, int wt, int idx, TrieNode root)
    {
        int cur = str.charAt(idx) - 'a';
      
        if (root.children[cur] == null)
            root.children[cur] = new TrieNode();
      
        // Assigning the maximum weight
        root.children[cur].weight =
                      Math.max(root.children[cur].weight, wt);
      
        if (idx + 1 != str.length())
            root.children[cur] =
               insert(str, wt, idx + 1, root.children[cur]);
      
        return root;
    }
      
    // Search and return the maximum weight.
    static int searchMaximum(String prefix, TrieNode root)
    {
        int idx = 0, ans = -1;
        int n = prefix.length();
      
        // Searching the prefix in TRie.
        while (idx < n)
        {
            int cur = prefix.charAt(idx) - 'a';
      
            // If prefix not found return -1.
            if (root.children[cur] == null)
                return -1;
      
            ans = root.children[cur].weight;
            root = root.children[cur];
            ++idx;
        }
      
        return ans;
    }
      
    // Return the maximum weight of string having given prefix.
    static int maxWeight(String str[], int weight[], int n,
                                           String prefix)
    {
        TrieNode root = new TrieNode();
      
        // Inserting all string in the Trie.
        for (int i = 0; i < n; i++)
            root = insert(str[i], weight[i], 0, root);
      
        return searchMaximum(prefix, root);
      
    }
      
    // Driven Program
    public static void main(String args[])
    {
        int n = 3;
        String str[] = { "geeks", "geeksfor", "geeksforgeeks" };
        int weight[] = {15, 30, 45};
        String prefix = "geek";
 
        System.out.println(maxWeight(str, weight, n, prefix));
    }
}
//This code is contributed by Sumit Ghosh
45

Este artículo es una contribución de Anuj Chauhan . 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 contribuido@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

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 *