Compruebe si se puede formar una string palindrómica concatenando substrings de dos strings dadas

Dadas dos strings str1 y str2 , la tarea es comprobar si es posible formar una String Palindrómica mediante la concatenación de dos substrings de str1 y str2 .

Ejemplos:

Entrada: str1 = “abcd”, str2 = “acba”
Salida:
Explicación:
Hay cinco casos posibles en los que la concatenación de dos substrings de str1 y str2 da una string palindrómica:
“ab” + “a” = “aba”
“ab” + “ba” = “abba”
“bc” + “cb” = “bccb”
“bc” + “b” = “bcb”
“cd” + “c” = “cdc”

Entrada: str1 = «pqrs», str2 = «abcd»
Salida: No
Explicación:
No hay una concatenación posible de substrings de strings dadas que da una string palindrómica.

Enfoque ingenuo:
el enfoque más simple para resolver el problema es generar todas las substrings posibles de str1 y str2 y combinarlas para generar todas las concatenaciones posibles. Para cada concatenación, compruebe si es palindrómica o no. Si es cierto, escriba “Sí” . De lo contrario, escriba “No” .
Complejidad de tiempo: O(N 2 * M 2 * (N+M)), donde N y M son las longitudes de str1 y str2 respectivamente.
Espacio Auxiliar: O(1)

Enfoque eficiente:
Para optimizar el enfoque anterior, es necesario hacer la siguiente observación:

Si las strings dadas poseen al menos un carácter común, siempre formarán una string palindrómica al concatenar el carácter común de ambas strings. 
Ilustración:
str1 = “ a bc”, str2 = “f a d” 
Dado que ‘a’ es común en ambas strings, se puede obtener una string palindrómica “ aa ”. 

Siga los pasos a continuación para resolver el problema:

  • Inicialice una array booleana para marcar la presencia de cada alfabeto en las dos strings.
  • Recorra str1 y marque el índice (str1[i] – ‘a’) como verdadero.
  • Ahora, recorra str2 y compruebe si algún índice (str2[i] – ‘a’) ya está marcado como verdadero , imprima «Sí» .
  • Después de completar el recorrido de str2 , si no se encuentra ningún carácter común, imprima «No».

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 to check if a palindromic
// string can be formed from the
// substring of given strings
bool check(string str1, string str2)
{
    // Boolean array to mark
    // presence of characters
    vector<bool> mark(26, false);
 
    int n = str1.size(),
        m = str2.size();
 
    for (int i = 0; i < n; i++) {
 
        mark[str1[i] - 'a'] = true;
    }
 
    // Check if any of the character
    // of str2 is already marked
    for (int i = 0; i < m; i++) {
 
        // If a common character
        // is found
        if (mark[str2[i] - 'a'])
            return true;
    }
 
    // If no common character
    // is found
    return false;
}
 
// Driver Code
int main()
{
 
    string str1 = "abca",
        str2 = "efad";
 
    if (check(str1, str2))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.Arrays;
 
class GFG{
     
// Function to check if a palindromic
// string can be formed from the
// substring of given strings
public static boolean check(String str1,
                            String str2)
{
     
    // Boolean array to mark
    // presence of characters
    boolean[] mark = new boolean[26];
    Arrays.fill(mark, false);
     
    int n = str1.length(),
        m = str2.length();
 
    for(int i = 0; i < n; i++)
    {
        mark[str1.charAt(i) - 'a'] = true;
    }
 
    // Check if any of the character
    // of str2 is already marked
    for(int i = 0; i < m; i++)
    {
 
        // If a common character
        // is found
        if (mark[str2.charAt(i) - 'a'])
            return true;
    }
 
    // If no common character
    // is found
    return false;
}
 
// Driver code
public static void main(String[] args)
{
    String str1 = "abca",
    str2 = "efad";
 
    if (check(str1, str2))
        System.out.println("Yes");
    else
        System.out.println("No");
}
}
 
// This code is contributed by divyeshrabadiya07

Python3

# Python3 program to implement
# the above approach
     
# Function to check if a palindromic
# string can be formed from the
# substring of given strings
def check(str1, str2):
     
    # Boolean array to mark
    # presence of characters
    mark = [False for i in range(26)]
     
    n = len(str1)
    m = len(str2)
     
    for i in range(n):
        mark[ord(str1[i]) - ord('a')] = True
     
    # Check if any of the character
    # of str2 is already marked
    for i in range(m):
         
        # If a common character
        # is found
        if (mark[ord(str2[i]) - ord('a')]):
            return True;
 
    # If no common character
    # is found
    return False
     
# Driver code
if __name__=="__main__":
     
    str1 = "abca"
    str2 = "efad"
 
    if (check(str1, str2)):
        print("Yes");
    else:
        print("No");
 
# This code is contributed by rutvik_56

C#

// C# program to implement
// the above approach
using System;
 
class GFG{
     
// Function to check if a palindromic
// string can be formed from the
// substring of given strings
public static bool check(String str1,
                        String str2)
{
     
    // Boolean array to mark
    // presence of characters
    bool[] mark = new bool[26];
     
    int n = str1.Length,
        m = str2.Length;
 
    for(int i = 0; i < n; i++)
    {
        mark[str1[i] - 'a'] = true;
    }
 
    // Check if any of the character
    // of str2 is already marked
    for(int i = 0; i < m; i++)
    {
 
        // If a common character
        // is found
        if (mark[str2[i] - 'a'])
            return true;
    }
 
    // If no common character
    // is found
    return false;
}
 
// Driver code
public static void Main(String[] args)
{
    String str1 = "abca",
    str2 = "efad";
 
    if (check(str1, str2))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed by amal kumar choubey

Javascript

<script>
 
// Javascript Program to implement
// the above approach
 
// Function to check if a palindromic
// string can be formed from the
// substring of given strings
function check(str1, str2)
{
    // Boolean array to mark
    // presence of characters
    var mark = Array(26).fill(false);
 
    var n = str1.length,
        m = str2.length;
 
    for (var i = 0; i < n; i++) {
 
        mark[str1[i] - 'a'] = true;
    }
 
    // Check if any of the character
    // of str2 is already marked
    for (var i = 0; i < m; i++) {
 
        // If a common character
        // is found
        if (mark[str2[i] - 'a'])
            return true;
    }
 
    // If no common character
    // is found
    return false;
}
 
// Driver Code
var str1 = "abca",
    str2 = "efad";
if (check(str1, str2))
    document.write( "Yes");
else
    document.write( "No");
 
// This code is contributed by noob2000.
</script>
Producción: 

Yes

Complejidad de tiempo: O(max(N, M)) donde N y M son las longitudes de str1 y str2 respectivamente.  Como, estamos atravesando ambas cuerdas.
Espacio auxiliar: O(1), ya que estamos usando cualquier espacio adicional.
 

Publicación traducida automáticamente

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