समस्या कथन
सम लंबाई की बाइनरी स्ट्रिंग और 0 और 1 की समान संख्या को देखते हुए। स्ट्रिंग को वैकल्पिक बनाने के लिए स्वैप की न्यूनतम संख्या क्या है? यदि कोई दो क्रमागत तत्व समान नहीं हैं तो एक बाइनरी स्ट्रिंग बारी-बारी से होती है
उदाहरण
अगर str =11110000 तो 2 स्वैप की आवश्यकता है।
एल्गोरिदम
- विषम स्थिति और स्ट्रिंग की सम स्थिति पर शून्यों की संख्या गिनें। उनकी गिनती क्रमशः विषम शून्य और सम शून्य हो
- विषम स्थिति और स्ट्रिंग की सम स्थिति पर संख्याओं की गणना करें। मान लीजिए कि उनकी संख्या क्रमशः विषम हैOneCnt और यहां तक किOneCnt
- हम हमेशा 1 को 0 के साथ स्वैप करेंगे। इसलिए हम सिर्फ यह जांचते हैं कि क्या हमारी वैकल्पिक स्ट्रिंग 0 से शुरू होती है तो स्वैप की संख्या न्यूनतम (ईवनज़ीरोसेंट, ऑडऑनसीएनटी) है और यदि हमारी वैकल्पिक स्ट्रिंग 1 से शुरू होती है तो स्वैप की संख्या है मिनट (समवन, विषम ज़ीरोसेंट)। उत्तर इन दोनों में से एक मिनट है
उदाहरण
#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