Compruebe si dos strings se pueden igualar invirtiendo la substring de igual longitud de ambas strings

Dé dos strings S1 y S2 , la tarea es verificar si la string S1 se puede igualar a la string S2 invirtiendo la substring de ambas strings de igual longitud. 

Nota: una substring se puede invertir cualquier número de veces.

Ejemplo: 

Entrada: S1 = “abbca”, S2 = “acabb” 
Salida: Sí 
Explicación: 
La string S1 y S2 se pueden igualar mediante: 
Invertir S1 en el rango [2, 4] (longitud = 3), S1 = “abacb” 
Invierta S2 en el rango [1, 3] (longitud = 3), S2 = «abacb» 
S1 = «abacb» y S2 = «abacb», después de invertir. 
Por lo tanto, ambos pueden hacerse iguales. 
 
Entrada: “ S1 = “abcd”, S2 = “abdc” 
Salida: No
 

Acercarse:  

  1. La idea es hacer que ambas strings sean iguales ordenándolas.
  2. Primero, verifique si ambas strings tienen el mismo conjunto de caracteres o no. Si no, entonces la respuesta es «No».
  3. Corrija la longitud de la substring para invertirla en 2. Ahora, esto significa intercambiar caracteres adyacentes.
  4. Ahora, el número de movimientos necesarios para ordenar una string invirtiendo la substring de tamaño 2 o, en otras palabras, intercambiando caracteres adyacentes, es el Recuento de inversión de la string.
  5. Si ambas strings tienen el mismo número de inversión, entonces la respuesta es «Sí».
  6. Si tienen diferentes recuentos de inversión, igualarlos solo es posible si al menos una de las siguientes condiciones coincide:
    • Primero, si la paridad del conteo de inversión es la misma, es decir, par o impar, entonces la respuesta es «Sí». Continuaremos intercambiando cualquier par de elementos en la string ordenada hasta que se ordene el otro. Dado que la diferencia en el recuento de inversiones será uniforme, por lo que intercambiar cualquier par dos veces no produce ningún cambio.
    • En segundo lugar, si la paridad no es la misma, entonces tiene que haber al menos un carácter con una frecuencia superior a 1 en cualquiera de las strings. Simplemente los intercambiaremos hasta que el otro se solucione. Dado que el intercambio de caracteres idénticos no produce ningún cambio.

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// function to count inversion
// count of the string
int inversionCount(string& s)
{
 
    // for storing frequency
    int freq[26] = { 0 };
    int inv = 0;
    for (int i = 0; i < s.length(); i++) {
        int temp = 0;
 
        // Add all the characters which
        // are less than the ith character
        // before i.
        for (int j = 0; j < int(s[i] - 'a'); j++)
            // adding the count to inversion
            // count
            temp += freq[j];
 
        inv += (i - temp);
        // updating the character in
        // the frequency array
 
        freq[s[i] - 'a']++;
    }
    return inv;
}
 
// function to check whether any
// of the string have a repeated
// character
bool haveRepeated(string& S1,
                string& S2)
{
 
    int freq[26] = { 0 };
    for (char i : S1) {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
 
    for (int i = 0; i < 26; i++)
        freq[i] = 0;
 
    for (char i : S2) {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
    return false;
}
 
// function to check whether the
// string S1 and S2 can be made
// equal by reversing sub strings
// of same size in both strings
void checkToMakeEqual(string S1,
                    string S2)
{
 
    // frequency array to check
    // whether both string have
    // same character or not
    int freq[26] = { 0 };
 
    for (int i = 0; i < S1.length(); i++) {
        // adding the frequency;
        freq[S1[i] - 'a']++;
    }
 
    bool flag = 0;
    for (int i = 0; i < S2.length(); i++) {
        if (freq[S2[i] - 'a'] == 0) {
            // if the character is not in S1
            flag = true;
            break;
        }
        // decrementing the frequency
        freq[S2[i] - 'a']--;
    }
 
    if (flag == true) {
        // If both string doesnot
        // have same characters or not
        cout << "No\n";
        return;
    }
 
    // finding inversion count
    // of both strings
    int invCount1 = inversionCount(S1);
    int invCount2 = inversionCount(S2);
 
    if (invCount1 == invCount2
        || (invCount1 & 1) == (invCount2 & 1)
        || haveRepeated(S1, S2)) {
        // If inversion count is same,
        // or have same parity or if
        // any of the string have a
        // repeated character then
        // the answer is Yes else No
        cout << "Yes\n";
    }
    else
        cout << "No\n";
}
 
// driver code
int main()
{
    string S1 = "abbca", S2 = "acabb";
    checkToMakeEqual(S1, S2);
    return 0;
}

Python3

# Python3 program for the above approach
 
# function to count inversion
# count of the string
def inversionCount(s):
     
    # for storing frequency
    freq = [0 for _ in range(26)]
    inv = 0
    for i in range(len(s)):
         
        # we'll add all the characters
        # which are less than the ith
        # character before i.
        temp = 0
        for j in range(ord(s[i]) - ord('a')):
             
            # adding the count to
            # inversion count
            temp += freq[j]
             
        inv += (i - temp)
         
        # updating the character in
        # the frequency array
        freq[ord(s[i]) - ord('a')] += 1
    return inv
 
# function to check whether
# any of the string have a
# repeated character
def haveRepeated(S1, S2):
    freq = [0 for _ in range(26)]
    for i in range(len(S1)):
        if freq[ord(S1[i]) - ord('a')] > 0:
            return 1
        freq[ord(S1[i]) - ord('a')] += 1
 
    for i in range(26):
        freq[i] = 0
 
    for i in range(len(S2)):
        if freq[ord(S2[i]) - ord('a')] > 0:
            return 1
        freq[ord(S2[i]) - ord('a')] += 1
 
    return 0
 
# function to check whether
# the string S1 and S2 can
# be made equal by reversing
# sub strings ofsame size in
# both strings
def checkToMakeEqual(S1, S2):
 
    # frequency array to check
    # whether both string have
    # same character or not
    freq = [0 for _ in range(26)]
 
    for i in range(len(S1)):
         
        # adding the frequency;
        freq[ord(S1[i]) - ord('a')] += 1
 
    flag = 0
    for i in range(len(S2)):
        if freq[ord(S2[i]) - ord('a')] == 0:
             
            # if the character is not in S1
            flag = 1
            break
             
        # decrementing the frequency
        freq[ord(S2[i]) - ord('a')] -= 1
     
    if flag == 1:
         
        # If both string does not
        # have same characters or not
        print("No")
        return
 
    # finding inversion count of
    # both strings
    invCount1 = inversionCount(S1)
    invCount2 = inversionCount(S2)
 
    if ((invCount1 == invCount2) or
       ((invCount1 % 2) == (invCount2 % 2)) or
         haveRepeated(S1, S2) == 1):
              
        # If inversion count is same,
        # or have same parity
        # or if any of the string
        # have a repeated character
        # then the answer is Yes else No
        print("Yes")
    else:
        print("No")
 
# Driver Code
S1 = "abbca"
S2 = "acabb"
 
checkToMakeEqual(S1, S2)

Java

// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG{
     
// Function to count inversion
// count of the string
static int inversionCount(String s)
{
     
    // For storing frequency
    int[] freq = new int[26];
    int inv = 0;
    for(int i = 0; i < s.length(); i++)
    {
        int temp = 0;
         
        // Add all the characters which
        // are less than the ith character
        // before i.
        for(int j = 0;
                j < (int)(s.charAt(i) - 'a');
                j++)
         
        // Adding the count to inversion
        // count
        temp += freq[j];
        inv += (i - temp);
         
        // Updating the character in
        // the frequency array
        freq[s.charAt(i) - 'a']++;
    }
    return inv;
}
 
// Function to check whether any
// of the string have a repeated
// character
static boolean haveRepeated(String S1,
                            String S2)
{
    int[] freq = new int[26];
    for(char i : S1.toCharArray())
    {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
     
    for(int i = 0; i < 26; i++)
        freq[i] = 0;
         
    for(char i : S2.toCharArray())
    {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
    return false;
}
 
// Function to check whether the
// string S1 and S2 can be made
// equal by reversing sub strings
// of same size in both strings
static void checkToMakeEqual(String S1,
                             String S2)
{
     
    // Frequency array to check
    // whether both string have
    // same character or not
    int[] freq = new int[26];
    for(int i = 0; i < S1.length(); i++)
    {
         
        // Adding the frequency;
        freq[S1.charAt(i) - 'a']++;
    }
     
    boolean flag = false;
    for(int i = 0; i < S2.length(); i++)
    {
        if (freq[S2.charAt(i) - 'a'] == 0)
        {
             
            // If the character is not in S1
            flag = true;
            break;
        }
         
        // Decrementing the frequency
        freq[S2.charAt(i) - 'a']--;
    }
     
    if (flag == true)
    {
         
        // If both string doesnot
        // have same characters or not
        System.out.println("No");
        return;
    }
     
    // Finding inversion count
    // of both strings
    int invCount1 = inversionCount(S1);
    int invCount2 = inversionCount(S2);
     
    if (invCount1 == invCount2 ||
       (invCount1 & 1) == (invCount2 & 1) ||
        haveRepeated(S1, S2))
    {
         
        // If inversion count is same,
        // or have same parity or if
        // any of the string have a
        // repeated character then
        // the answer is Yes else No
        System.out.println("Yes");
    }
    else
    System.out.println("No");
}
 
// Driver Code
public static void main (String[] args)
{
    String S1 = "abbca", S2 = "acabb";
     
    checkToMakeEqual(S1, S2);
}
}
 
// This code is contributed by offbeat

C#

// C# program for the above approach
using System;
class GFG{
     
// Function to count inversion
// count of the string
static int inversionCount(String s)
{
     
    // For storing frequency
    int[] freq = new int[26];
    int inv = 0;
    for(int i = 0; i < s.Length; i++)
    {
        int temp = 0;
         
        // Add all the characters which
        // are less than the ith character
        // before i.
        for(int j = 0;
                j < (int)(s[i] - 'a');
                j++)
         
        // Adding the count to inversion
        // count
        temp += freq[j];
        inv += (i - temp);
         
        // Updating the character in
        // the frequency array
        freq[s[i] - 'a']++;
    }
    return inv;
}
 
// Function to check whether any
// of the string have a repeated
// character
static bool haveRepeated(String S1,
                            String S2)
{
    int[] freq = new int[26];
    foreach(char i in S1.ToCharArray())
    {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
     
    for(int i = 0; i < 26; i++)
        freq[i] = 0;
         
    foreach(char i in S2.ToCharArray())
    {
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    }
    return false;
}
 
// Function to check whether the
// string S1 and S2 can be made
// equal by reversing sub strings
// of same size in both strings
static void checkToMakeEqual(String S1,
                             String S2)
{
     
    // Frequency array to check
    // whether both string have
    // same character or not
    int[] freq = new int[26];
    for(int i = 0; i < S1.Length; i++)
    {
         
        // Adding the frequency;
        freq[S1[i] - 'a']++;
    }
     
    bool flag = false;
    for(int i = 0; i < S2.Length; i++)
    {
        if (freq[S2[i] - 'a'] == 0)
        {
             
            // If the character is not in S1
            flag = true;
            break;
        }
         
        // Decrementing the frequency
        freq[S2[i] - 'a']--;
    }
     
    if (flag == true)
    {
         
        // If both string doesnot
        // have same characters or not
        Console.WriteLine("No");
        return;
    }
     
    // Finding inversion count
    // of both strings
    int invCount1 = inversionCount(S1);
    int invCount2 = inversionCount(S2);
     
    if (invCount1 == invCount2 ||
       (invCount1 & 1) == (invCount2 & 1) ||
        haveRepeated(S1, S2))
    {
         
        // If inversion count is same,
        // or have same parity or if
        // any of the string have a
        // repeated character then
        // the answer is Yes else No
        Console.WriteLine("Yes");
    }
    else
    Console.WriteLine("No");
}
 
// Driver Code
public static void Main(String[] args)
{
    String S1 = "abbca", S2 = "acabb";
     
    checkToMakeEqual(S1, S2);
}
}
 
// This code is contributed by gauravrajput1

Javascript

<script>
 
// Javascript program for the above approach
 
// function to count inversion
// count of the string
function inversionCount(s)
{
 
    // For storing frequency
    var freq = Array(26).fill(0);
    var inv = 0;
    for(var i = 0; i < s.length; i++)
    {
        var temp = 0;
 
        // Add all the characters which
        // are less than the ith character
        // before i.
        for(var j = 0;
                j < String.fromCharCode(
                      s[i].charCodeAt(0) -
                       'a'.charCodeAt(0)); j++)
                        
            // Adding the count to inversion
            // count
            temp += freq[j];
 
        inv += (i - temp);
         
        // Updating the character in
        // the frequency array
        freq[s[i] - 'a']++;
    }
    return inv;
}
 
// Function to check whether any
// of the string have a repeated
// character
function haveRepeated(S1, S2)
{
    var freq = Array(26).fill(0);
 
    S1.forEach(i => {
         
        if (freq[i - 'a'] > 0)
            return true;
        freq[i - 'a']++;
    });
 
    for(var i = 0; i < 26; i++)
        freq[i] = 0;
 
    S2.split('').forEach(i => {
         
        if (freq[i - 'a'] > 0)
            return true;
             
        freq[i - 'a']++;
    });
    return false;
}
 
// Function to check whether the
// string S1 and S2 can be made
// equal by reversing sub strings
// of same size in both strings
function checkToMakeEqual(S1, S2)
{
 
    // Frequency array to check
    // whether both string have
    // same character or not
    var freq = Array(26).fill(0);
 
    for(var i = 0; i < S1.length; i++)
    {
         
        // Adding the frequency;
        freq[S1[i] - 'a']++;
    }
 
    var flag = 0;
    for(var i = 0; i < S2.length; i++)
    {
        if (freq[S2[i] - 'a'] == 0)
        {
             
            // If the character is not in S1
            flag = true;
            break;
        }
         
        // Decrementing the frequency
        freq[S2[i] - 'a']--;
    }
 
    if (flag == true)
    {
         
        // If both string doesnot
        // have same characters or not
        document.write("No<br>");
        return;
    }
 
    // Finding inversion count
    // of both strings
    var invCount1 = inversionCount(S1);
    var invCount2 = inversionCount(S2);
 
    if (invCount1 == invCount2 ||
       (invCount1 & 1) == (invCount2 & 1) ||
       haveRepeated(S1, S2))
    {
         
        // If inversion count is same,
        // or have same parity or if
        // any of the string have a
        // repeated character then
        // the answer is Yes else No
        document.write("Yes<br>");
    }
    else
        document.write("No<br>");
}
 
// Driver code
var S1 = "abbca", S2 = "acabb";
checkToMakeEqual(S1, S2);
 
// This code is contributed by itsok
 
</script>
Producción: 

Yes

 

Complejidad del tiempo: 

O(N)
 Space Complexity: 
O(1)
 

Publicación traducida automáticamente

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