给定一个长度为N的字符串S和一个二进制字符串B ,任务是检查给定的字符串S 是否可以通过在字符串B 中由不等字符组成的任何一对索引处重复交换字符来检查是否可以使给定的字符串S成为回文。
例子:
Input: S = “BAA”, B = “100”
Output: Yes
Explanation:
Swapping S[0] and S[1] modifies S to “ABA” and B to “010”.
Input: S = “ACABB”, B = “00000”
Output: No
方法:按照以下步骤解决此问题:
- 检查字符串S 是否可以重新排列以形成回文字符串。如果发现为false ,则打印“No” 。
- 否则,如果字符串S是回文,则打印“Yes” 。
- 如果0和1的计数至少为 1 ,那么总有一种方法可以交换字符以使给定的字符串S回文。因此,打印“是” 。否则,打印“否” 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Utility function to check if string
// S can be made palindromic or not
bool canBecomePalindromeUtil(string S, string B)
{
// Stores the number of distinct
// characters present in string S
unordered_set set;
// Traverse the characters of string S
for(int i = 0; i < S.size(); i++)
{
// Insert current character in S
set.insert(S[i]);
}
// Count frequency of each
// character of string S
map map;
// Traverse the characters of string S
for(int i = 0; i < S.length(); i++)
{
map[S[i]] += 1;
}
bool flag = false;
// Check for the odd length string
if (S.size() % 2 == 1)
{
// Stores the count of
// even and odd frequenct
// characters in the string S
int count1 = 0, count2 = 0;
for(auto e : map)
{
if (e.second % 2 == 1)
{
// Update the count of
// odd frequent characters
count2++;
}
else
{
// Update the count of
// even frequent characters
count1++;
}
}
// If the conditions satisfies
if (count1 == set.size() - 1 && count2 == 1)
{
flag = true;
}
}
// Check for even length string
else
{
// Stores the frequency of
// even and odd characters
// in the string S
int count1 = 0, count2 = 0;
for(auto e : map)
{
if (e.second % 2 == 1)
{
// Update the count of
// odd frequent characters
count2++;
}
else
{
// Update the count of
// even frequent characters
count1++;
}
}
// If the condition satisfies
if (count1 == set.size() && count2 == 0)
{
flag = true;
}
}
// If a palindromic string
// cannot be formed
if (!flag)
{
return false;
}
else
{
// Check if there is
// atleast one '1' and '0'
int count1 = 0, count0 = 0;
for(int i = 0; i < B.size(); i++)
{
// If current character is '1'
if (B[i] == '1')
{
count1++;
}
else
{
count0++;
}
}
// If atleast one '1' and '0' is present
if (count1 >= 1 && count0 >= 1)
{
return true;
}
else
{
return false;
}
}
}
// Function to determine whether
// string S can be converted to
// a palindromic string or not
void canBecomePalindrome(string S, string B)
{
if (canBecomePalindromeUtil(S, B))
cout << "Yes";
else
cout << "No";
}
// Driver code
int main()
{
string S = "ACABB";
string B = "00010";
canBecomePalindrome(S, B);
return 0;
}
// This code is contributed by Kingash
Java
// Java program for the above approach
import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
class GFG {
// Utility function to check if string
// S can be made palindromic or not
public static boolean
canBecomePalindromeUtil(String S,
String B)
{
// Stores the number of distinct
// characters present in string S
HashSet set = new HashSet<>();
// Traverse the characters of string S
for (int i = 0; i < S.length(); i++) {
// Insert current character in S
set.add(S.charAt(i));
}
// Count frequency of each
// character of string S
HashMap map
= new HashMap<>();
// Traverse the characters of string S
for (int i = 0; i < S.length(); i++) {
Integer k = map.get(S.charAt(i));
map.put(S.charAt(i),
(k == null) ? 1 : k + 1);
}
boolean flag = false;
// Check for the odd length string
if (S.length() % 2 == 1) {
// Stores the count of
// even and odd frequenct
// characters in the string S
int count1 = 0, count2 = 0;
for (Map.Entry e :
map.entrySet()) {
if (e.getValue() % 2 == 1) {
// Update the count of
// odd frequent characters
count2++;
}
else {
// Update the count of
// even frequent characters
count1++;
}
}
// If the conditions satisfies
if (count1 == set.size() - 1
&& count2 == 1) {
flag = true;
}
}
// Check for even length string
else {
// Stores the frequency of
// even and odd characters
// in the string S
int count1 = 0, count2 = 0;
for (Map.Entry e :
map.entrySet()) {
if (e.getValue() % 2 == 1) {
// Update the count of
// odd frequent characters
count2++;
}
else {
// Update the count of
// even frequent characters
count1++;
}
}
// If the condition satisfies
if (count1 == set.size()
&& count2 == 0) {
flag = true;
}
}
// If a palindromic string
// cannot be formed
if (!flag) {
return false;
}
else {
// Check if there is
// atleast one '1' and '0'
int count1 = 0, count0 = 0;
for (int i = 0;
i < B.length(); i++) {
// If current character is '1'
if (B.charAt(i) == '1') {
count1++;
}
else {
count0++;
}
}
// If atleast one '1' and '0' is present
if (count1 >= 1 && count0 >= 1) {
return true;
}
else {
return false;
}
}
}
// Function to determine whether
// string S can be converted to
// a palindromic string or not
public static void
canBecomePalindrome(String S,
String B)
{
if (canBecomePalindromeUtil(S, B))
System.out.print("Yes");
else
System.out.print("No");
}
// Driver Code
public static void main(String[] args)
{
String S = "ACABB";
String B = "00010";
canBecomePalindrome(S, B);
}
}
Python3
# Python3 program for the above approach
# Utility function to check if string
# S can be made palindromic or not
def canBecomePalindromeUtil(S, B):
# Stores the number of distinct
# characters present in string S
s = set(S)
# Count frequency of each
# character of string S
map = {}
# Traverse the characters of string S
for i in range(len(S)):
if S[i] in map:
map[S[i]] += 1
else:
map[S[i]] = 1
flag = False
# Check for the odd length string
if (len(S) % 2 == 1):
# Stores the count of
# even and odd frequenct
# characters in the string S
count1 = 0
count2 = 0
for e in map:
if (map[e] % 2 == 1):
# Update the count of
# odd frequent characters
count2 += 1
else:
# Update the count of
# even frequent characters
count1 += 1
# If the conditions satisfies
if (count1 == len(s) - 1 and
count2 == 1):
flag = True
# Check for even length string
else:
# Stores the frequency of
# even and odd characters
# in the string S
count1 = 0
count2 = 0
for e in map:
if (map[e] % 2 == 1):
# Update the count of
# odd frequent characters
count2 += 1
else:
# Update the count of
# even frequent characters
count1 += 1
# If the condition satisfies
if (count1 == len(s) and count2 == 0):
flag = True
# If a palindromic string
# cannot be formed
if (not flag):
return False
else:
# Check if there is
# atleast one '1' and '0'
count1 = 0
count0 = 0
for i in range(len(B)):
# If current character is '1'
if (B[i] == '1'):
count1 += 1
else:
count0 += 1
# If atleast one '1' and '0' is present
if (count1 >= 1 and count0 >= 1):
return True
else:
return False
# Function to determine whether
# string S can be converted to
# a palindromic string or not
def canBecomePalindrome(S, B):
if (canBecomePalindromeUtil(S, B)):
print("Yes")
else:
print("No")
# Driver code
if __name__ == "__main__":
S = "ACABB"
B = "00010"
canBecomePalindrome(S, B)
# This code is contributed by AnkThon
Javascript
输出:
Yes
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。