Divida una string en strings palindrómicas de al menos 2 de longitud con cada carácter presente en una sola string

Dada una string S que consta de N alfabetos en minúsculas, la tarea es verificar si todas las strings de al menos una longitud de 2 formadas al seleccionar cada carácter de la string S solo una vez son palindrómicas o no . Si se encuentra que es cierto, escriba «Sí» . De lo contrario, escriba “No” .

Ejemplos:

Entrada: S = “abbbaddzcz”
Salida:
Explicación: Las strings palindrómicas de longitud superior a 1 son { “aa”, “bbb”, “dd”, “zcz”} y todos los caracteres de la string dada se usan solo una vez . Por lo tanto, imprima «Sí».

Entrada: S = “abcd”
Salida: No

Enfoque: la idea es dividir la string en strings palindrómicas de longitud uniforme, y si existe un carácter que tenga una frecuencia 1 , entonces emparejarlo con una string palindrómica de longitud uniforme. Siga los pasos a continuación para resolver el problema:

  • Inicialice una array , digamos freq[] , de tamaño 26 , para almacenar la frecuencia de cada carácter presente en la string .
  • Itere sobre los caracteres de la string S dada y actualice la frecuencia de cada carácter en la array freq[] .
  • Inicialice dos variables, digamos O y E , para almacenar el recuento de caracteres únicos y caracteres que tienen frecuencias pares, respectivamente.
  • Recorra la array freq[] y si freq[i] es igual a 1 , entonces incremente O en 1 . De lo contrario, incremente E en 1 .
  • Compruebe si E ≥ O , luego escriba “Sí” . De lo contrario, realice los siguientes pasos:
    • Actualice O a O – E , para almacenar los caracteres únicos restantes después del emparejamiento.
    • Atraviese la array freq[] y si el valor de O es como máximo 0 , salga del bucle . De lo contrario, actualice O a O – (freq[i]/2) y luego incremente O en 1 .
  • Después de completar los pasos anteriores, si el valor de O ≤ 0 , imprima «Sí» . De lo contrario, escriba “No” .

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

C++

// C++ program for the above approach
 
#include <iostream>
using namespace std;
 
// Function to check if  a string can be
// split into palindromic strings of at
// least length 2 by including every
// character exactly once
void checkPalindrome(string& s)
{
    // Stores the frequency
    // of each character
    int a[26] = { 0 };
 
    // Store the frequency of
    // characters with frequencies
    // 1 and even respectively
    int o = 0, e = 0;
 
    // Traverse the string s
    for (int i = 0; s[i] != '\0'; i++)
        a[(int)s[i] - 97]++;
 
    // Iterate over all the characters
    for (int i = 0; i < 26; i++) {
 
        // If the frequency is 1
        if (a[i] == 1)
            o++;
 
        // If frequency is even
        else if (a[i] % 2 == 0
                 and a[i] != 0)
            e += (a[i] / 2);
    }
 
    // Print the result
    if (e >= o)
        cout << "Yes";
 
    else {
 
        // Stores the number of characters
        // with frequency equal to 1 that
        // are not part of a palindromic string
        o = o - e;
 
        // Iterate over all the characters
        for (int i = 0; i < 26; i++) {
 
            // If o becomes less than 0,
            // then break out of the loop
            if (o <= 0)
                break;
 
            // If frequency of the current
            // character is > 2 and is odd
            if (o > 0
                and a[i] % 2 == 1
                and a[i] > 2) {
 
                int k = o;
 
                // Update the value of o
                o = o - a[i] / 2;
 
                // If a single character
                // is still remaining
                if (o > 0 or 2 * k + 1 == a[i]) {
 
                    // Increment o by 1
                    o++;
 
                    // Set a[i] to 1
                    a[i] = 1;
                }
            }
        }
 
        // Print the result
        if (o <= 0)
            cout << "Yes";
        else
            cout << "No";
    }
}
 
// Driver Code
int main()
{
    string S = "abbbaddzcz";
    checkPalindrome(S);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to check if  a string can be
// split into palindromic strings of at
// least length 2 by including every
// character exactly once
static void checkPalindrome(String s)
{
     
    // Stores the frequency
    // of each character
    int a[] = new int[26];
 
    // Store the frequency of
    // characters with frequencies
    // 1 and even respectively
    int o = 0, e = 0;
 
    // Traverse the string s
    for(int i = 0; i < s.length(); i++)
        a[s.charAt(i) - 'a']++;
 
    // Iterate over all the characters
    for(int i = 0; i < 26; i++)
    {
         
        // If the frequency is 1
        if (a[i] == 1)
            o++;
 
        // If frequency is even
        else if (a[i] % 2 == 0 && a[i] != 0)
            e += (a[i] / 2);
    }
 
    // Print the result
    if (e >= o)
        System.out.println("Yes");
 
    else
    {
         
        // Stores the number of characters
        // with frequency equal to 1 that
        // are not part of a palindromic string
        o = o - e;
 
        // Iterate over all the characters
        for(int i = 0; i < 26; i++)
        {
             
            // If o becomes less than 0,
            // then break out of the loop
            if (o <= 0)
                break;
 
            // If frequency of the current
            // character is > 2 and is odd
            if (o > 0 && a[i] % 2 == 1 && a[i] > 2)
            {
                int k = o;
 
                // Update the value of o
                o = o - a[i] / 2;
 
                // If a single character
                // is still remaining
                if (o > 0 || 2 * k + 1 == a[i])
                {
                     
                    // Increment o by 1
                    o++;
 
                    // Set a[i] to 1
                    a[i] = 1;
                }
            }
        }
 
        // Print the result
        if (o <= 0)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// Driver Code
public static void main(String[] args)
{
    String S = "abbbaddzcz";
     
    checkPalindrome(S);
}
}
 
// This code is contributed by Kingash

Python3

# Python3 program for the above approach
 
# Function to check if  a string can be
# split into palindromic strings of at
# least length 2 by including every
# character exactly once
def checkPalindrome(s):
     
    # Stores the frequency
    # of each character
    a = [0] * 26
 
    # Store the frequency of
    # characters with frequencies
    # 1 and even respectively
    o, e = 0, 0
 
    # Traverse the string s
    for i in s:
        a[ord(i) - 97] += 1
 
    # Iterate over all the characters
    for i in range(26):
         
        # If the frequency is 1
        if (a[i] == 1):
            o += 1
 
        # If frequency is even
        elif (a[i] % 2 == 0 and a[i] != 0):
            e += (a[i] // 2)
 
    # Print the result
    if (e >= o):
        print("Yes")
    else:
         
        # Stores the number of characters
        # with frequency equal to 1 that
        # are not part of a palindromic string
        o = o - e
 
        # Iterate over all the characters
        for i in range(26):
             
            # If o becomes less than 0,
            # then break out of the loop
            if (o <= 0):
                break
 
            # If frequency of the current
            # character is > 2 and is odd
            if (o > 0 and a[i] % 2 == 1 and a[i] > 2):
                k = o
                 
                # Update the value of o
                o = o - a[i] // 2
 
                # If a single character
                # is still remaining
                if (o > 0 or 2 * k + 1 == a[i]):
 
                    # Increment o by 1
                    o += 1
 
                    # Set a[i] to 1
                    a[i] = 1
 
        # Print the result
        if (o <= 0):
            print("Yes")
        else:
            print("No")
             
# Driver Code
if __name__ == '__main__':
     
    S = "abbbaddzcz"
     
    checkPalindrome(S)
 
# This code is contributed by mohit kumar 29

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to check if  a string can be
// split into palindromic strings of at
// least length 2 by including every
// character exactly once
static void checkPalindrome(string s)
{
     
    // Stores the frequency
    // of each character
    int[] a = new int[26];
 
    // Store the frequency of
    // characters with frequencies
    // 1 and even respectively
    int o = 0, e = 0;
 
    // Traverse the string s
    for(int i = 0; i < s.Length; i++)
        a[s[i] - 'a']++;
 
    // Iterate over all the characters
    for(int i = 0; i < 26; i++)
    {
         
        // If the frequency is 1
        if (a[i] == 1)
            o++;
 
        // If frequency is even
        else if (a[i] % 2 == 0 && a[i] != 0)
            e += (a[i] / 2);
    }
 
    // Print the result
    if (e >= o)
        Console.WriteLine("Yes");
 
    else
    {
         
        // Stores the number of characters
        // with frequency equal to 1 that
        // are not part of a palindromic string
        o = o - e;
 
        // Iterate over all the characters
        for(int i = 0; i < 26; i++)
        {
             
            // If o becomes less than 0,
            // then break out of the loop
            if (o <= 0)
                break;
 
            // If frequency of the current
            // character is > 2 and is odd
            if (o > 0 && a[i] % 2 == 1 && a[i] > 2)
            {
                int k = o;
 
                // Update the value of o
                o = o - a[i] / 2;
 
                // If a single character
                // is still remaining
                if (o > 0 || 2 * k + 1 == a[i])
                {
                     
                    // Increment o by 1
                    o++;
 
                    // Set a[i] to 1
                    a[i] = 1;
                }
            }
        }
 
        // Print the result
        if (o <= 0)
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// Driver code
static void Main()
{
    string S = "abbbaddzcz";
     
    checkPalindrome(S);
}
}
 
// This code is contributed by sanjoy_62

Javascript

<script>
 
        // Javascript program for the above approach
 
        // Function to check if  a string can be
        // split into palindromic strings of at
        // least length 2 by including every
        // character exactly once
        function checkPalindrome( s )
        {
            // Stores the frequency
            // of each character
            let a = [0]
 
            // Store the frequency of
            // characters with frequencies
            // 1 and even respectively
            let o = 0, e = 0;
 
            // Traverse the string s
            for (let i = 0; i<s.length; i++)
                a[s.charCodeAt(i) - 97]++;
 
            // Iterate over all the characters
            for (let i = 0; i < 26; i++) {
 
                // If the frequency is 1
                if (a[i] == 1)
                    o++;
 
                // If frequency is even
                else if (a[i] % 2 == 0 && a[i] != 0)
                    e += (a[i] / 2);
            }
 
            // Print the result
            if (e >= o)
                document.write("Yes")
 
            else {
 
                // Stores the number of characters
                // with frequency equal to 1 that
                // are not part of a palindromic string
                o = o - e;
 
                // Iterate over all the characters
                for (let i = 0; i < 26; i++)
                {
 
                    // If o becomes less than 0,
                    // then break out of the loop
                    if (o <= 0)
                        break;
 
                    // If frequency of the current
                    // character is > 2 and is odd
                    if (o > 0 && a[i] % 2 == 1 && a[i] > 2)
                    {
 
                        let k = o;
 
                        // Update the value of o
                        o = o - a[i] / 2;
 
                        // If a single character
                        // is still remaining
                        if (o > 0 || 2 * k + 1 == a[i])
                        {
 
                            // Increment o by 1
                            o++;
 
                            // Set a[i] to 1
                            a[i] = 1;
                        }
                    }
                }
 
                // Print the result
                if (o <= 0)
                document.write("Yes")
                else
                document.write("No")
            }
        }
 
        // Driver Code
         
        let S = "abbbaddzcz";
        checkPalindrome(S);
 
        // This code is contributed by Hritik
         
    </script>
Producción: 

Yes

 

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

Publicación traducida automáticamente

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