使C ++中的字符串相等的最小交换
假设我们有两个长度相等的字符串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+(x1mod2)*2
例子(C++)
让我们看下面的实现以更好地理解-
#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