1247. Minimum Swaps to Make Strings Equal
Вам даны две строки s1 и s2 одинаковой длины, состоящие только из букв "x" и "y". Ваша задача - сделать эти две строки равными друг другу. Вы можете поменять местами любые два символа, принадлежащие разным строкам, что означает: поменять местами s1[i] и s2[j]. Верните минимальное количество обменов, необходимое для того, чтобы сделать s1 и s2 равными, или верните -1, если это невозможно сделать.
Пример:
Input: arr = [1,2]
Output: 2
C# решение
сопоставлено/оригиналpublic class Solution {
public int MinimumSwap(string s1, string s2) {
int xy = 0, yx = 0;
for (int i = 0; i < s1.Length; i++) {
if (s1[i] == 'x' && s2[i] == 'y') {
xy++;
} else if (s1[i] == 'y' && s2[i] == 'x') {
yx++;
}
}
if ((xy + yx) % 2 != 0) {
return -1;
}
return xy / 2 + yx / 2 + (xy % 2) * 2;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int MinimumSwap(string s1, string s2) {
int xy = 0, yx = 0;
for (int i = 0; i < s1.size(); i++) {
if (s1[i] == 'x' && s2[i] == 'y') {
xy++;
} else if (s1[i] == 'y' && s2[i] == 'x') {
yx++;
}
}
if ((xy + yx) % 2 != 0) {
return -1;
}
return xy / 2 + yx / 2 + (xy % 2) * 2;
}
}
Java решение
auto-draft, проверить перед отправкойimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public int MinimumSwap(String s1, String s2) {
int xy = 0, yx = 0;
for (int i = 0; i < s1.length; i++) {
if (s1[i] == 'x' && s2[i] == 'y') {
xy++;
} else if (s1[i] == 'y' && s2[i] == 'x') {
yx++;
}
}
if ((xy + yx) % 2 != 0) {
return -1;
}
return xy / 2 + yx / 2 + (xy % 2) * 2;
}
}
Python решение
сопоставлено/оригиналdef minimumSwap(s1, s2):
xy = yx = 0
for a, b in zip(s1, s2):
if a == 'x' and b == 'y':
xy += 1
elif a == 'y' and b == 'x':
yx += 1
if (xy + yx) % 2 != 0:
return -1
return xy // 2 + yx // 2 + (xy % 2) * 2
Go решение
сопоставлено/оригиналfunc minimumSwap(s1 string, s2 string) int {
xy, yx := 0, 0
for i := 0; i < len(s1); i++ {
if s1[i] == 'x' && s2[i] == 'y' {
xy++
} else if s1[i] == 'y' && s2[i] == 'x' {
yx++
}
}
if (xy+yx)%2 != 0 {
return -1
}
return xy/2 + yx/2 + (xy%2)*2
}
Algorithm
Подсчет несоответствующих пар:
Пройдите по строкам s1 и s2, чтобы подсчитать количество пар xy и yx. Пара xy возникает, когда s1[i] равно 'x', а s2[i] равно 'y'. Пара yx возникает, когда s1[i] равно 'y', а s2[i] равно 'x'.
Проверка четности:
Если сумма количества пар xy и yx нечетная, то невозможно сделать строки равными, поскольку каждая замена уменьшает сумму несоответствующих пар на 2. В этом случае верните -1.
Вычисление минимального количества замен:
Если количество пар xy четное и количество пар yx четное, то каждые две пары xy и каждые две пары yx можно обменять за один ход. Поэтому минимальное количество замен равно xy // 2 + yx // 2.
Если количество пар xy нечетное и количество пар yx нечетное, то мы можем обменять одну пару xy и одну пару yx за два хода. Поэтому минимальное количество замен равно xy // 2 + yx // 2 + 2.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.