📜  将字符串分成长度至少为2的回文字符串,每个字符出现在单个字符串

📅  最后修改于: 2021-04-17 16:16:43             🧑  作者: Mango

给定一个字符串S选自N小写字母,任务是,以检查是否通过选择字符串的每个字符形成至少长度为2的所有的字符串S只有一次是回文或没有。如果发现是真的,则打印“是” 。否则,打印“否”

例子:

方法:这个想法是将字符串分成长度相等的回文字符串,如果存在一个频率为1的字符,则将其与长度相等的回文字符串配对。请按照以下步骤解决问题:

  • 初始化一个大小为26的数组,例如freq [] ,以存储出现在字符串的每个字符的频率。
  • 遍历给定字符串S的字符,并更新数组freq []中每个字符的频率
  • 初始化两个变量,说OE,存储分别为偶数频率独特的和计数。
  • 遍历数组freq [] ,如果freq [i]等于1 ,则将O递增1 。否则,将E增加1
  • 检查E≥O ,然后打印“是” 。否则,请执行以下步骤:
    • Ø更新至O – E,以配对后的剩余独特的字符存储。
    • 遍历数组freq [] ,如果O的值最多为0 ,则跳出循环。否则,更新O操作-O – (FREQ [I] / 2),并通过1然后增量O操作
  • 完成上述步骤后,如果≤0的值,则输出“是”。否则,打印“否”

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
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


输出:
Yes

时间复杂度: O(N)
辅助空间: O(1)