Menos recuento de palabras necesarias para construir una string de destino

Dada una array de strings , palabras[] de tamaño M y una string de destino de tamaño N. La tarea es encontrar el número mínimo de palabras requeridas para deletrear el objetivo de la string cortando letras individuales de la colección de palabras y reorganizándolas, siempre que haya cantidades infinitas de cada palabra. Si no es posible, imprima -1.

Ejemplos:

Enfoque: La idea es utilizar backtracking . Siga los pasos para resolver el problema:

  • Declare una array 2D , digamos countMap[][], donde countMap[i][j] almacena el recuento de j -ésimo carácter en i -ésima string.
  • Declare una array charAvavilable[26], que indica el recuento actual de caracteres disponibles.
  • Defina una función recursiva que tome el índice actual, i (inicialmente 0) de la string, objetivo como entrada.
    • Si el conteo actual es mayor que el conteo general, devuelva . Además, si el índice actual, i es igual a N , actualice el recuento general y devuelva .
    • Si hay una ocurrencia de target[i] en charAvailable[] ,
      • Disminuya la ocurrencia del carácter target[i] en charAvailable[] .
      • Llame recursivamente al índice i+1 , actualizando simultáneamente el conteo por 1.
      • Incrementa la aparición del carácter target[i] en 1 después de la llamada de función para retroceder .
    • De lo contrario, itere el countMap[][] para encontrar la aparición de target[i] . Si la encuentra, llame recursivamente a la función actualizando el conteo en 1 y también realice el paso de retroceso después de la llamada a la función.
  • Escriba el número mínimo de palabras requeridas.

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

C++

// C++ program of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// countMap[][] to store
// count of characters
vector<vector<int> > countMap;
 
int cnt = INT_MAX;
 
// Function to get minimum number of
// stickers for a particular state
void count(int curCnt, int pos, vector<int>charAvailable,
           string target, vector<string> stickers)
{
     
    // If an optimal solution is
    // already there, return
    if (curCnt >= cnt)
        return;
 
    int m = stickers.size();
    int n = target.size();
 
    // If Target has been constructed
    // update cnt and return
    if (pos == n)
    {
        cnt = min(cnt, curCnt);
        return;
    }
 
    char c = target[pos];
 
    if (charAvailable > 0)
    {
         
        // Update charAvailable[]
        charAvailable--;
 
        // Recursizevely function call
        // for (pos + 1)
        count(curCnt, pos + 1, charAvailable,
              target, stickers);
 
        // Update charAvailable[]
        charAvailable++;
    }
    else
    {
        for(int i = 0; i < m; i++)
        {
            if (countMap[i] == 0)
                continue;
 
            // Update charAvailable[]
            for(int j = 0; j < 26; j++)
            {
                charAvailable[j] += countMap[i][j];
            }
 
            // Recursizeve Call
            count(curCnt + 1, pos, charAvailable,
                  target, stickers);
 
            // Update charAvailable[]
            for(int j = 0; j < 26; j++)
            {
                charAvailable[j] -= countMap[i][j];
            }
        }
    }
}
 
// Function to find the minimum
// number of stickers
int minStickers(vector<string> stickers,
                string target)
{
     
    // Base Case
    if (target == "")
        return -1;
 
    if (target.size() == 0)
        return 0;
 
    if (stickers.size() == 0)
        return -1;
 
    int m = stickers.size();
    countMap.resize(m, vector<int>(26, 0));
     
    // Fill the countMap Array
    for(int i = 0; i < stickers.size(); i++)
    {
        string s = stickers[i];
        for(char c : s)
        {
            countMap[i]++;
        }
    }
 
    // Recusizeve function call to get
    // minimum number of stickers
    vector<int> temp(26);
    count(0, 0, temp, target, stickers);
 
    return cnt == INT_MAX ? -1 : cnt;
}
 
// Driver Code
int main()
{
     
    // Given Input
    vector<string> str = {"with", "example", "science"};
    string target = "thehat";
 
    // Function Call
    int Result = minStickers(str, target);
 
    // Print the result
    cout << Result;
}
 
// This code is contributed by mohit kumar 29

Java

// Java program of the above approach
import java.io.*;
import java.util.*;
 
class Sol {
 
    // countMap[][] to store
    // count of characters
    int[][] countMap;
 
    int cnt = Integer.MAX_VALUE;
 
    // Function to find the minimum
    // number of stickers
    public int minStickers(String[] stickers
                           , String target)
    {
        // Base Case
        if (target == null)
            return -1;
 
        if (target.length() == 0)
            return 0;
 
        if (stickers == null || stickers.length == 0)
            return -1;
 
        int m = stickers.length;
        countMap = new int[m][26];
 
        // Fill the countMap Array
        for (int i = 0; i < stickers.length; i++) {
            String s = stickers[i];
            for (char c : s.toCharArray()) {
                countMap[i]++;
            }
        }
 
        // Recursive function call to get
        // minimum number of stickers
        count(0, 0, new int[26], target, stickers);
 
        return cnt == Integer.MAX_VALUE ? -1 : cnt;
    }
 
    // Function to get minimum number of
    // stickers for a particular state
    private void count(int curCnt, int pos,
                       int[] charAvailable, String target,
                       String[] stickers)
    {
        // If an optimal solution is
        // already there, return
        if (curCnt >= cnt)
            return;
 
        int m = stickers.length;
        int n = target.length();
 
        // If Target has been constructed
        // update cnt and return
        if (pos == n) {
            cnt = Math.min(cnt, curCnt);
            return;
        }
 
        char c = target.charAt(pos);
 
        if (charAvailable > 0) {
 
            // Update charAvailable[]
            charAvailable--;
 
            // Recursively function call
            // for (pos + 1)
            count(curCnt, pos + 1, charAvailable, target,
                  stickers);
 
            // Update charAvailable[]
            charAvailable++;
        }
        else {
            for (int i = 0; i < m; i++) {
 
                if (countMap[i] == 0)
                    continue;
 
                // Update charAvailable[]
                for (int j = 0; j < 26; j++) {
                    charAvailable[j] += countMap[i][j];
                }
 
                // Recursive Call
                count(curCnt + 1, pos, charAvailable,
                      target, stickers);
 
                // Update charAvailable[]
                for (int j = 0; j < 26; j++) {
                    charAvailable[j] -= countMap[i][j];
                }
            }
        }
    }
}
 
class GFG {
 
    // Driver Code
    public static void main(String[] args)
    {
        Sol st = new Sol();
 
        // Given Input
        String[] str = { "with", "example", "science" };
        String target = "thehat";
 
        // Function Call
        int Result = st.minStickers(str, target);
 
        // Print the result
        System.out.println(Result);
    }
}
Producción: 

3

 

Complejidad de tiempo: O(M*26*2 N )
Espacio auxiliar: O(M*26)

Publicación traducida automáticamente

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