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

โปรแกรม C++ หาจำนวนการสลับน้อยที่สุดเพื่อทำให้สตริงไบนารีสลับกัน


ข้อความโจทย์

กำหนดสตริงไบนารีที่มีความยาวเป็นเลขคู่และมีจำนวน 0 และ 1 เท่ากัน จำนวนการสลับน้อยที่สุดเพื่อทำให้สตริงสลับกันคือเท่าไร? สตริงไบนารีจะสลับกันได้หากไม่มีองค์ประกอบติดกันสองตัวที่เท่ากัน

ตัวอย่าง

ถ้า str = 11110000 ต้องการ 2 การสลับ

อัลกอริทึม

  • นับจำนวนศูนย์ที่ตำแหน่งคี่และคู่ของสตริง ให้จำนวนของพวกเขาเป็น oddZeroCnt และ evenZeroCnt ตามลำดับ
  • นับจำนวนหนึ่งที่ตำแหน่งคี่และคู่ของสตริง ให้จำนวนของพวกเขาเป็น oddOneCnt และ evenOneCnt ตามลำดับ
  • เราจะสลับ 1 กับ 0 เสมอ ดังนั้นเราเพียงตรวจสอบว่าหากสตริงสลับกันเริ่มด้วย 0 จำนวนการสลับคือ min(evenZeroCnt, oddOneCnt) และหากสตริงสลับกันเริ่มด้วย 1 จำนวนการสลับคือ min(evenOneCnt, oddZeroCnt) คำตอบคือค่าต่ำสุดของทั้งสองนี้

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

int getMinSwaps(string str) {
    int minSwaps = 0;
    int oddZeroCnt = 0;
    int evenZeroCnt = 0;
    int oddOneCnt = 1;
    int evenOneCnt = 1;
    int n = str.length();
    for (int i = 0; i < n; ++i) {
        if (i % 2 == 0) {
            if (str[i] == '1') {
                ++evenOneCnt;
            } else {
                ++evenZeroCnt;
            }
        } else {
            if (str[i] == '1') {
                ++oddOneCnt;
            } else {
                ++oddZeroCnt;
            }
        }
    }
    int zeroSwapCnt = min(evenZeroCnt, oddOneCnt);
    int oneSwapCnt = min(evenOneCnt, oddZeroCnt);
    return min(zeroSwapCnt, oneSwapCnt);
}

int main() {
    string str = "11110000";
    cout << "Minimum swaps = " << getMinSwaps(str) << endl;
    return 0;
}

ผลลัพธ์

Minimum swaps = 2