给定一个由N个小写字母组成的字符串S ,任务是检查所有长度至少为 2的字符串是否通过只选择字符串S 的每个字符一次而形成的所有字符串都是回文的。如果发现是真的,则打印“是” 。否则,打印“否” 。
例子:
Input: S = “abbbaddzcz”
Output: Yes
Explanation: The palindromic strings of length greater than 1 are { “aa”, “bbb”, “dd”, “zcz”} and all the characters in the given string is used only once. Therefore, print “Yes”.
Input: S = “abcd”
Output: No
方法:思路是将字符串分解成偶数长度的回文字符串,如果存在频率为1的字符,则将其与偶数长度的回文字符串配对。请按照以下步骤解决问题:
- 初始化一个数组,比如freq[] ,大小为26 ,以存储字符串中每个字符的频率。
- 迭代给定字符串S的字符并更新数组freq[]中每个字符的频率。
- 初始化两个变量,说O和E,存储分别为偶数频率独特的和计数。
- 遍历数组freq[]并且如果freq[i]等于1 ,则将O增加1 。否则,将E增加1 。
- 检查是否E ≥ O ,然后打印“是” 。否则,请执行以下步骤:
- Ø更新至O – E,以配对后的剩余独特的字符存储。
- 遍历数组freq[] ,如果O的值最多为0 ,则跳出循环。否则,更新O操作-O – (FREQ [I] / 2),并通过1然后增量O操作。
- 完成上述步骤后,如果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
Javascript
输出:
Yes
时间复杂度: O(N)
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live