Compruebe si la string S2 se puede obtener agregando subsecuencias de la string S1

Dadas dos strings S1 y S2 , la tarea es comprobar si es posible generar la string S2 agregando repetidamente subsecuencias de S1 al final de una string inicialmente vacía. Si es posible, escriba “ SI ” y el número mínimo de operaciones requeridas. De lo contrario, escriba “ NO ”.

Ejemplos:

Entrada: S1 = “acebcd”, S2 = “acbcd” 
Salida: 
SÍ 

Explicación: Agregue la subsecuencia “acbc” seguida de “d” para obtener S2.

Entrada: S1 = “aceasd”, S2 = “asdxds” 
Salida: NO 
Explicación: Dado que el carácter ‘x’ no está presente en S1, no se puede obtener S2.

Enfoque: siga los pasos a continuación para resolver el problema:

  • Itere sobre los caracteres de la string S1 y almacene las frecuencias de cada carácter en S1 en una array freq[] .
  • Atraviese la string S2 y verifique si hay algún carácter en S2 que no esté presente en S1 . Si se encuentra alguno de estos caracteres, escriba “NO”.
  • De lo contrario, itere sobre los caracteres en S1 y actualice los índices de cada carácter en un Conjunto
  • Recorra la string S2 y para cada carácter, verifique si se puede incluir en la subsecuencia actual de S1 que se puede agregar.
  • Si se determina que es cierto, establezca el índice del carácter actual como el del último carácter agregado. De lo contrario, aumente el número de subsecuencias y establezca el índice del carácter actual como el del último carácter añadido. Continúe con el siguiente carácter.
  • finalmente, imprima “ SI ” y el conteo de tales subsecuencias como respuesta requerida.

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

C++

// C++ Program to implement
// the above approach
#include "bits/stdc++.h"
using namespace std;
 
// Function for finding minimum
// number of operations
int findMinimumOperations(string s,
                          string s1)
{
 
    // Stores the length of strings
    int n = s.length(), m = s1.length();
 
    // Stores frequency of
    // characters in string s
    int frequency[26] = { 0 };
 
    // Update  frequencies of
    // character in s
    for (int i = 0; i < n; i++)
        frequency[s[i] - 'a']++;
 
    // Traverse string s1
    for (int i = 0; i < m; i++) {
 
        // If any character in s1
        // is not present in s
        if (frequency[s1[i] - 'a']
            == 0) {
            return -1;
        }
    }
 
    // Stores the indices of
    // each character in s
    set<int> indices[26];
 
    // Traverse string s
    for (int i = 0; i < n; i++) {
 
        // Store indices of characters
        indices[s[i] - 'a'].insert(i);
    }
 
    int ans = 1;
 
    // Stores index of last
    // appended character
    int last = (*indices[s1[0]
                      - 'a']
                     .begin());
 
    // Traverse string s1
    for (int i = 1; i < m; i++) {
 
        int ch = s1[i] - 'a';
 
        // Find the index of next
        // character that can be appended
        auto it = indices[ch].upper_bound(
            last);
 
        // Check if the current
        // character be included
        // in the current subsequence
        if (it != indices[ch].end()) {
            last = (*it);
        }
 
        // Otherwise
        else {
 
            // Start a new subsequence
            ans++;
 
            // Update index of last
            // character appended
            last = (*indices[ch].begin());
        }
    }
    return ans;
}
 
// Driver Code
int main()
{
 
    string S1 = "acebcd", S2 = "acbcde";
    int ans = findMinimumOperations(
        S1, S2);
 
    // If S2 cannot be obtained
    // from subsequences of S1
    if (ans == -1) {
        cout << "NO\n";
    }
    // Otherwise
    else {
        cout << "YES\n"
             << ans;
    }
 
    return 0;
}

Python3

# Python3 Program to implement
# the above approach
from bisect import bisect ,bisect_left,bisect_right
 
# Function for finding minimum
# number of operations
def findMinimumOperations(s,s1):
 
    #Stores the length of strings
    n = len(s)
    m = len(s1)
 
    # Stores frequency of
    # characters in string s
    frequency = [0]*26
 
    # Update  frequencies of
    # character in s
    for i in range(n):
        frequency[ord(s[i]) - ord('a')] += 1
 
    # Traverse string s1
    for i in range(m):
 
        # If any character in s1
        # is not present in s
        if (frequency[ord(s1[i]) - ord('a')] == 0):
            return -1
 
    # Stores the indices of
    # each character in s
    indices = [[] for i in range(26)]
 
    # Traverse string s
    for i in range(n):
 
        # Store indices of characters
        indices[ord(s[i]) - ord('a')].append(i)
 
    ans = 2
 
    # Stores index of last
    # appended character
    last =len(indices[ord(s1[0])- ord('a')]) - 1
 
    # Traverse string s1
    for i in range(1,m):
 
        ch = ord(s1[i]) - ord('a')
 
        # Find the index of next
        # character that can be appended
        it = bisect_right(indices[ch],last)
        # print(it)
 
        # Check if the current
        # character be included
        # in the current subsequence
        if (it != len(indices[ch])):
            last = it
        # Otherwise
        else:
 
            # Start a new subsequence
            ans += 1
 
            # Update index of last
            # character appended
            last = len(indices[ch])
    return ans
 
# Driver Code
if __name__ == '__main__':
 
    S1 = "acebcd"
    S2 = "acbcde"
    ans = findMinimumOperations(S1, S2)
 
    # If S2 cannot be obtained
    # from subsequences of S1
    if (ans == -1):
        print("NO")
    # Otherwise
    else:
        print("YES")
        print(ans)
 
# This code is contributed by mohit kumar 29
Producción: 

YES
2

 

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

Publicación traducida automáticamente

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