给定由小写字母组成的两个长度为N 的字符串S和T ,任务是最小化使两个字符串的字符的 ASCII 值之和为奇数所需的相同索引元素的交换次数。如果不可能使 ASCII 值的总和为奇数,则打印“-1” 。
例子:
Input:S = ”acd”, T = ”dbf”
Output: 1
Explanation:
Swapping S[1] and T[1] modifies S to “abd” and T to “dcf”.
Sum of ASCII value of characters of the string S = 97 + 98 + 100 = 297 (Odd).
Sum of ASCII value of characters of the string T = 100 + 99 + 102 = 301 (Odd).
Input: S = “aey”, T = “cgj”
Output: -1
处理方法:按照以下步骤解决问题:
- 计算字符串S和T的字符的 ASCII 值之和,分别存储在变量sum1和sum2 中。
- 如果sum1和sum2已经是奇数,则打印0 ,因为不需要交换。
- 如果sum1和sum2具有不同的奇偶校验,则打印-1 ,因为两个字符串的和不能具有相同的奇偶校验。
- 如果sum1和sum2都是偶数,则遍历给定的字符串S和T。如果存在具有奇数ASCII值的任何字符,这两个字符串的字符的ASCII值的总和可以通过奇数仅1交换制备。否则,打印-1 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to count the number of swaps
// required to make the sum of ASCII values
// of the characters of both strings odd
void countSwaps(string S, string T)
{
// Initialize alphabets with value
int value[26];
// Initialize values for each
// alphabet
for (int i = 0; i < 26; i++)
value[i] = i + 1;
// Size of the string
int N = S.size();
// Sum of string S
int sum1 = 0;
// Sum of string T
int sum2 = 0;
// Stores whether there is any
// index i such that S[i] and
// T[i] have different parities
bool flag = false;
// Traverse the strings
for (int i = 0; i < N; i++) {
// Update sum1 and sum2
sum1 += value[S[i] - 'a'];
sum2 += value[T[i] - 'a'];
// If S[i] and T[i] have
// different parities
if ((value[S[i] - 'a'] % 2 == 0
&& value[T[i] - 'a'] % 2 == 1)
|| (value[S[i] - 'a'] % 2 == 1
&& value[T[i] - 'a'] % 2 == 0))
flag = false;
}
// If sum1 and sum2 are both odd
if (sum1 % 2 == 1
&& sum2 % 2 == 1)
cout << "0\n";
// If sum1 and sum2 are both even
else if (sum1 % 2 == 0
&& sum2 % 2 == 0) {
// If exists print 1
if (flag)
cout << "1";
// Otherwise
else
cout << "-1";
}
// If sum1 and sum2 are
// of different parities
else {
cout << "-1";
}
}
// Driver Code
int main()
{
string S = "acd";
string T = "dbf";
// Function Call
countSwaps(S, T);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Function to count the number of swaps
// required to make the sum of ASCII values
// of the characters of both strings odd
static void countSwaps(String S, String T)
{
// Initialize alphabets with value
int[] value = new int[26];
// Initialize values for each
// alphabet
for (int i = 0; i < 26; i++)
value[i] = i + 1;
// Size of the string
int N = S.length();
// Sum of string S
int sum1 = 0;
// Sum of string T
int sum2 = 0;
// Stores whether there is any
// index i such that S[i] and
// T[i] have different parities
boolean flag = false;
// Traverse the strings
for (int i = 0; i < N; i++) {
// Update sum1 and sum2
sum1 += value[S.charAt(i) - 'a'];
sum2 += value[T.charAt(i) - 'a'];
// If S[i] and T[i] have
// different parities
if ((value[S.charAt(i) - 'a'] % 2 == 0
&& value[T.charAt(i) - 'a'] % 2 == 1)
|| (value[S.charAt(i) - 'a'] % 2 == 1
&& value[T.charAt(i) - 'a'] % 2 == 0))
flag = false;
}
// If sum1 and sum2 are both odd
if (sum1 % 2 == 1
&& sum2 % 2 == 1)
System.out.println("0\n");
// If sum1 and sum2 are both even
else if (sum1 % 2 == 0
&& sum2 % 2 == 0) {
// If exists print 1
if (flag)
System.out.println("1");
// Otherwise
else
System.out.println("-1");
}
// If sum1 and sum2 are
// of different parities
else {
System.out.println("-1");
}
}
// Driver Code
public static void main(String[] args)
{
String S = "acd";
String T = "dbf";
// Function Call
countSwaps(S, T);
}
}
// This code is contributed by susmitakundugoaldanga.
Python3
# Python3 program for the above approach
# Function to count the number of swaps
# required to make the sum of ASCII values
# of the characters of both strings odd
def countSwaps(S, T):
# Initialize alphabets with value
value = [0]*26
# Initialize values for each
# alphabet
for i in range(26):
value[i] = i + 1
# Size of the string
N = len(S)
# Sum of S
sum1 = 0
# Sum of T
sum2 = 0
# Stores whether there is any
# index i such that S[i] and
# T[i] have different parities
flag = False
# Traverse the strings
for i in range(N):
# Update sum1 and sum2
sum1 += value[ord(S[i]) - ord('a')]
sum2 += value[ord(T[i]) - ord('a')]
# If ord(S[i]) anord('a)rd(T[i]) haord('a)
# different parities
if (value[ord(S[i]) - ord('a')] % 2 == 0
and value[ord(T[i]) - ord('a')] % 2 == 1
or value[ord(S[i]) - ord('a')] % 2 == 1
and value[ord(T[i]) - ord('a')] % 2 == 0):
flag = False
# If sum1 and sum2 are both odd
if (sum1 % 2 == 1 and sum2 % 2 == 1):
print("0")
# If sum1 and sum2 are both even
elif (sum1 % 2 == 0 and sum2 % 2 == 0):
# If exists pr1
if (flag):
print("1")
# Otherwise
else:
print("-1")
# If sum1 and sum2 are
# of different parities
else:
print("-1")
# Driver Code
if __name__ == '__main__':
S = "acd"
T = "dbf"
# Function Call
countSwaps(S, T)
# This code is contributed by mohit kumar 29.
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to count the number of swaps
// required to make the sum of ASCII values
// of the characters of both strings odd
static void countSwaps(string S, string T)
{
// Initialize alphabets with value
int[] value = new int[26];
// Initialize values for each
// alphabet
for (int i = 0; i < 26; i++)
value[i] = i + 1;
// Size of the string
int N = S.Length;
// Sum of string S
int sum1 = 0;
// Sum of string T
int sum2 = 0;
// Stores whether there is any
// index i such that S[i] and
// T[i] have different parities
bool flag = false;
// Traverse the strings
for (int i = 0; i < N; i++) {
// Update sum1 and sum2
sum1 += value[S[i] - 'a'];
sum2 += value[T[i] - 'a'];
// If S[i] and T[i] have
// different parities
if ((value[S[i] - 'a'] % 2 == 0
&& value[T[i] - 'a'] % 2 == 1)
|| (value[S[i] - 'a'] % 2 == 1
&& value[T[i] - 'a'] % 2 == 0))
flag = false;
}
// If sum1 and sum2 are both odd
if (sum1 % 2 == 1
&& sum2 % 2 == 1)
Console.Write("0\n");
// If sum1 and sum2 are both even
else if (sum1 % 2 == 0
&& sum2 % 2 == 0) {
// If exists print 1
if (flag)
Console.Write("1");
// Otherwise
else
Console.Write("-1");
}
// If sum1 and sum2 are
// of different parities
else {
Console.Write("-1");
}
}
// Driver Code
public static void Main(String[] args)
{
string S = "acd";
string T = "dbf";
// Function Call
countSwaps(S, T);
}
}
// This code is contributed by code_hunt.
Javascript
输出:
-1
时间复杂度: O(N)
辅助空间: O(26)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。