假设我们有两个长度相等的字符串s1和s2,仅由字母“ x”和“ y”组成。我们的任务是使这两个字符串彼此相等。我们可以交换属于不同字符串的任意两个字符,这意味着-交换s1 [i]和s2 [j]。我们必须找到使s1和s2相等所需的最小交换数,如果不可能,则返回-1。因此,如果字符串是s1 =“ xy”而s2 =“ yx”,则输出将为2。如果我们交换s1 [0]和s2 [0],则s1 =“ yy”,s2 =“ xx”。然后交换s1 [0]和s2 [1],s1 =“ xy”,s2 =“ xy”。
为了解决这个问题,我们将遵循以下步骤-
将x1,x2,y1和y2设置为0
对于范围从0到s1的i
如果a ='x',则将x1加1,否则将y1加1
如果b ='x'然后增加x2,否则将y2增加1
a:= s1 [i]和b:= s2 [i]
如果a与b不同,则
如果(x1 + x2)为奇数或(y1 + y2)为奇数,则返回-1
返回x1 / 2 + y1 / 2 +(x1 mod 2)* 2
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int minimumSwap(string s1, string s2) { int x1 = 0, x2 = 0, y1 = 0, y2 = 0; for(int i = 0; i < s1.size(); i++){ char a = s1[i]; char b = s2[i]; if(a != b){ if(a == 'x')x1++; else y1++; if(b == 'x')x2++; else y2++; } } if ((x1 + x2) & 1 || (y1 + y2) & 1)return -1; return x1/2 + y1/2 + (x1 % 2) * 2; } }; main(){ Solution ob; cout <<ob.minimumSwap("xy", "yx"); }
"xy" "yx"
输出结果
2