Cuente todas las substrings de Palindrome en una string | conjunto 2

Dada una string, la tarea es contar todas las substrings de palíndromo en una string dada. La longitud de la substring del palíndromo es mayor o igual a 2.

Examples:
Input : str = "abaab"
Output: 3
Explanation : 
All palindrome substring are :
 "aba", "aa", "baab" 

Input : str = "abbaeae"
Output: 4
Explanation : 
All palindrome substring are : 
"bb", "abba", "aea", "eae":

Hemos discutido una solución basada en programación dinámica en la publicación a continuación. Cuente todas las substrings de Palindrome en una string | Conjunto 1 La solución discutida aquí es la extensión del problema de la substring palindrómica más larga

La idea es que cada carácter en la string de entrada dada, lo consideremos como el punto medio de un palíndromo y lo expandamos en ambas direcciones para encontrar todos los palíndromos de longitudes pares e impares. Usamos hashmap para realizar un seguimiento de todos los palíndromos distintos de longitud superior a 1 y devolver el tamaño del mapa que cuenta con todas las substrings de palíndromos posibles. 

Implementación:

CPP

// C++ program to count all distinct palindromic
// substrings of a string.
#include <bits/stdc++.h>
using namespace std;
 
// Returns total number of palindrome substring of
// length greater than equal to 2
int countPalindromes(string s)
{
    unordered_map<string, int> m;
    for (int i = 0; i < s.length(); i++) {
 
        // check for odd length palindromes
        for (int j = 0; j <= i; j++) {
 
            if (!s[i + j])
                break;
 
            if (s[i - j] == s[i + j]) {
 
                // check for palindromes of length
                // greater than 1
                if ((i + j + 1) - (i - j) > 1)
                    m[s.substr(i - j,
                        (i + j + 1) - (i - j))]++;
 
            } else
                break;
        }
 
        // check for even length palindromes
        for (int j = 0; j <= i; j++) {
            if (!s[i + j + 1])
                break;
            if (s[i - j] == s[i + j + 1]) {
 
                // check for palindromes of length
                // greater than 1
                if ((i + j + 2) - (i - j) > 1)
                    m[s.substr(i - j,
                         (i + j + 2) - (i - j))]++;
 
            } else
                break;
        }
    }
    return m.size();
}
 
// Driver code
int main()
{
    string s = "abbaeae";
    cout << countPalindromes(s) << endl;
    return 0;
}

Java

// Java Program to count palindrome substring
// in a string
public class PalindromeSubstring {
     
    // Method which return count palindrome substring
    static int countPS(String str){
        String temp = "";
        StringBuffer stf;
        int count = 0;
        // Iterate the loop twice
        for (int i = 0; i < str.length(); i++) {
            for (int j = i + 1; j <= str.length(); j++) {
                // Get each substring
                temp = str.substring(i, j);
                 
                // If length is greater than or equal to two
                // Check for palindrome   
                if (temp.length() >= 2) {
                    // Use StringBuffer class to reverse the string
                    stf = new StringBuffer(temp);
                    stf.reverse();
                    // Compare substring with reverse of substring
                    if (stf.toString().compareTo(temp) == 0)
                        count++;
                }
            }
        }
        // return the count
        return count;
    }
     
    // Driver Code
    public static void main(String args[]) throws Exception {
        // Declare and initialize the string
        String str = "abbaeae";
        // Call the method
        System.out.println(countPS(str));
    }
} // This code is contributes by hungundji

Python3

# Python program to count all distinct palindromic
# substrings of a string.
 
# Returns total number of palindrome substring of
# length greater than equal to 2
def countPalindromes(s):
 
    m = {}
    for i in range(len(s)):
 
        # check for odd length palindromes
        for j in range(i+1):
 
            if (i + j >= len(s)):
                break
 
            if (s[i - j] == s[i + j]):
 
                # check for palindromes of length
                # greater than 1
                if ((i + j + 1) - (i - j) > 1):
                    if(s[i - j:(i + j + 1)] in m):
                        m[s[i - j:(i + j + 1)]] += 1
                    else:
                        m[s[i - j:(i + j + 1)]] = 1
 
            else:
                break
 
        # check for even length palindromes
        for j in range(i+1):
            if (i + j + 1 >= len(s)):
                break
            if (s[i - j] == s[i + j + 1]):
 
                # check for palindromes of length
                # greater than 1
                if ((i + j + 2) - (i - j) > 1):
                    if(s[i - j:i + j + 2] in m):
                        m[s[i - j:(i + j + 2)]] += 1
                    else:
                        m[s[i - j:(i + j + 2)]] = 1
 
            else:
                break
         
    return len(m)
 
# Driver code
s = "abbaeae"
print(countPalindromes(s))
 
# This code is contributed by shinjanpatra

C#

// C# Program to count palindrome substring
// in a string
using System;
 
class GFG
{
     
    // Method which return count palindrome substring
    static int countPS(String str)
    {
        String temp = "";
        String stf;
        int count = 0;
         
        // Iterate the loop twice
        for (int i = 0; i < str.Length; i++)
        {
            for (int j = i + 1;
                     j <= str.Length; j++)
            {
                // Get each substring
                temp = str.Substring(i, j-i);
                 
                // If length is greater than or equal to two
                // Check for palindrome
                if (temp.Length >= 2)
                {
                    // Use StringBuffer class to reverse
                    // the string
                    stf = temp;
                    stf = reverse(temp);
                     
                    // Compare substring with reverse of substring
                    if (stf.ToString().CompareTo(temp) == 0)
                        count++;
                }
            }
        }
         
        // return the count
        return count;
    }
     
    static String reverse(String input)
    {
        char[] a = input.ToCharArray();
        int l, r = 0;
        r = a.Length - 1;
 
        for (l = 0; l < r; l++, r--)
        {
            // Swap values of l and r
            char temp = a[l];
            a[l] = a[r];
            a[r] = temp;
        }
        return String.Join("",a);
    }
     
    // Driver Code
    public static void Main(String []args)
    {
        // Declare and initialize the string
        String str = "abbaeae";
         
        // Call the method
        Console.WriteLine(countPS(str));
    }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// JavaScript program to count all distinct palindromic
// substrings of a string.
 
// Returns total number of palindrome substring of
// length greater than equal to 2
function countPalindromes(s)
{
    let m = new Map();
    for (let i = 0; i < s.length; i++) {
 
        // check for odd length palindromes
        for (let j = 0; j <= i; j++) {
 
            if (!s[i + j])
                break;
 
            if (s[i - j] == s[i + j]) {
 
                // check for palindromes of length
                // greater than 1
                if ((i + j + 1) - (i - j) > 1){
                    if(m.has(s.substr(i - j,(i + j + 1) - (i - j)))){
                        m.set(s.substr(i - j,(i + j + 1) - (i - j)),m.get(s.substr(i - j,(i + j + 1) - (i - j))) + 1)
                    }
                    else m.set(s.substr(i - j,(i + j + 1) - (i - j)),1)
                }
 
            } else
                break;
        }
 
        // check for even length palindromes
        for (let j = 0; j <= i; j++) {
            if (!s[i + j + 1])
                break;
            if (s[i - j] == s[i + j + 1]) {
 
                // check for palindromes of length
                // greater than 1
                if ((i + j + 2) - (i - j) > 1){
                    if(m.has(s.substr(i - j,(i + j + 2) - (i - j)))){
                        m.set(s.substr(i - j,(i + j + 2) - (i - j)),m.get(s.substr(i - j,(i + j + 2) - (i - j))) + 1)
                    }
                    else m.set(s.substr(i - j,(i + j + 2) - (i - j)),1)
                }
 
            } else
                break;
        }
    }
    return m.size;
}
 
// Driver code
 
let s = "abbaeae"
document.write(countPalindromes(s),"</br>")
 
// This code is contributed by shinjanpatra
 
</script>
Producción

4

Complejidad temporal O(n 2 ) Espacio auxiliar O(n) Este artículo es una contribución de Ankur Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

En el enfoque discutido anteriormente, estamos usando un mapa desordenado que ocupa el espacio O (n), pero podemos hacer lo mismo sin usar ningún espacio adicional. En lugar de hacer un mapa hash, podemos contar directamente la substring palindrómica.

Implementación:

C++

#include <bits/stdc++.h>
using namespace std;
int countPalindromes(string s)
{
    int n = s.size();
    int count = 0;
    for (int i = 0; i < s.size(); i++) {
        int left = i - 1;
        int right = i + 1;
        while (left >= 0 and right < n) {
            if (s[left] == s[right])
                count++;
            else
                break;
            left--;
            right++;
        }
    }
 
    for (int i = 0; i < s.size(); i++) {
        int left = i;
        int right = i + 1;
        while (left >= 0 and right < n) {
            if (s[left] == s[right])
                count++;
            else
                break;
            left--;
            right++;
        }
    }
    return count;
}
int main()
{
 
    string s = "abbaeae";
    cout << countPalindromes(s) << endl;
    return 0;
}
// This  code is contributed by Arpit Jain

Python

# Python program to count all distinct palindromic
# substrings of a string.
 
# Returns total number of palindrome substring of
# length greater than equal to 2
 
 
def countPalindromes(s):
    n = len(s)
    count = 0
    for i in range(0, n):
        left = i-1
        right = i+1
        while left >= 0 and right < n:
            if s[left] == s[right]:
                count += 1
            else:
                break
            left -= 1
            right += 1
    for i in range(0, n):
        left = i
        right = i+1
        while left >= 0 and right < n:
            if s[left] == s[right]:
                count += 1
            else:
                break
            left -= 1
            right += 1
    return count
 
   # Driver code
s = "abbaeae"
print(countPalindromes(s))
 
# This code is contributed by Arpit Jain
Producción

4

La complejidad del tiempo es O(n^2) en el peor de los casos porque estamos ejecutando un ciclo while dentro de un ciclo for porque en el ciclo while nos estamos expandiendo en ambas direcciones, por eso es O(n/2) en el peor de los casos cuando todos los caracteres son iguales, por ejemplo: «aaaaaaaa».

Pero no estamos usando ningún espacio adicional, la Complejidad espacial es O(1) . 

Publicación traducida automáticamente

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