Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Swap ขั้นต่ำเพื่อทำให้สตริงเท่ากันใน 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
  • สำหรับ i ในช่วง 0 ถึงขนาด s1
    • a :=s1[i] และ b :=s2[i]
    • ถ้า a ไม่เหมือนกับ b แล้ว
      • ถ้า a ='x' ให้เพิ่ม x1 ไม่เช่นนั้นให้เพิ่ม y1 ขึ้น 1
      • ถ้า b ='x' ให้เพิ่ม x2 ไม่เช่นนั้น ให้เพิ่ม y2 ขึ้น 1
  • ถ้า (x1 + x2) เป็นเลขคี่หรือ (y1 + y2) เป็นเลขคี่ ให้คืนค่า -1
  • ผลตอบแทน x1/2 + y1/2 + (x1 mod 2) * 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