Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में दो स्ट्रिंग्स को समान बनाने के लिए दिए गए ऑपरेशन के न्यूनतम नंबर

समस्या कथन

दो स्ट्रिंग्स str1 और str2 दी गई हैं, दोनों में 'a' और 'b' वर्ण हैं। दोनों स्ट्रिंग्स समान लंबाई की हैं। दोनों स्ट्रिंग्स में एक _ (खाली स्थान) है। पहले स्ट्रिंग को दूसरी स्ट्रिंग में बदलने के लिए निम्न ऑपरेशन का उपयोग करके न्यूनतम ऑपरेशन की संख्या ढूंढें:

  • यदि _ स्थिति i पर है तो _ को स्थिति i+1 या i-1 पर वर्ण के साथ स्वैप किया जा सकता है
  • यदि स्थिति i+1 और i+2 पर वर्ण अलग हैं तो _ को स्थिति i+1 या i+2 पर वर्ण के साथ स्वैप किया जा सकता है
  • इसी तरह, यदि स्थिति i-1 और i-2 पर वर्ण अलग हैं तो _ को स्थिति i-1 या i-2 पर वर्ण के साथ स्वैप किया जा सकता है

यदि str1="aba_a" और str2="_baaa", तो str1 को str2 में बदलने के लिए 2 मूव्स आवश्यक हैं:

1. str1 = "ab_aa" (str1[2] को str1[3] के साथ स्वैप किया)
2. str1 = "_baaa" (str1[0] को str1[2] के साथ स्वैप किया)

एल्गोरिदम

1. स्ट्रिंग पर साधारण ब्रेडथ फर्स्ट सर्च लागू करें और BFS के लिए उपयोग की जाने वाली क्यू का एक तत्व pair str, pos होगा जहां pos स्ट्रिंग str में _ की स्थिति है।
2. 'vis' नामक एक मैप भी बनाए रखें जो स्ट्रिंग को कुंजी के रूप में और स्ट्रिंग तक पहुंचने के लिए न्यूनतम मूव्स को मान के रूप में संग्रहीत करेगा।
3. क्यू से प्रत्येक स्ट्रिंग str के लिए, दी गई चार शर्तों के आधार पर एक नई स्ट्रिंग tmp उत्पन्न करें और vis मैप को अपडेट करें: vis[tmp] = vis[str] + 1।
4. उपरोक्त चरणों को तब तक दोहराएं जब तक क्यू खाली न हो जाए या आवश्यक स्ट्रिंग उत्पन्न न हो जाए यानी tmp == B।
5. यदि आवश्यक स्ट्रिंग उत्पन्न होती है, तो vis[str] + 1 लौटाएं जो A को B में बदलने के लिए आवश्यक न्यूनतम ऑपरेशन की संख्या है।

C++ उदाहरण

#include <iostream>
#include <string>
#include <unordered_map>
#include <queue>
using namespace std;

int transformString(string str, string f) {
    unordered_map<string, int> vis;
    int n = str.length();
    int pos = 0;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == '_') { pos = i; break; }
    }
    queue<pair<string, int>> q;
    q.push({str, pos});
    vis[str] = 0;
    
    while (!q.empty()) {
        string ss = q.front().first;
        int pp = q.front().second;
        int dist = vis[ss];
        q.pop();
        
        if (pp > 0) {
            swap(ss[pp], ss[pp - 1]);
            if (!vis.count(ss)) {
                if (ss == f) return dist + 1;
                vis[ss] = dist + 1;
                q.push({ss, pp - 1});
            }
            swap(ss[pp], ss[pp - 1]);
        }
        if (pp < n - 1) {
            swap(ss[pp], ss[pp + 1]);
            if (!vis.count(ss)) {
                if (ss == f) return dist + 1;
                vis[ss] = dist + 1;
                q.push({ss, pp + 1});
            }
            swap(ss[pp], ss[pp + 1]);
        }
        if (pp > 1 && ss[pp - 1] != ss[pp - 2]) {
            swap(ss[pp], ss[pp - 2]);
            if (!vis.count(ss)) {
                if (ss == f) return dist + 1;
                vis[ss] = dist + 1;
                q.push({ss, pp - 2});
            }
            swap(ss[pp], ss[pp - 2]);
        }
        if (pp < n - 2 && ss[pp + 1] != ss[pp + 2]) {
            swap(ss[pp], ss[pp + 2]);
            if (!vis.count(ss)) {
                if (ss == f) return dist + 1;
                vis[ss] = dist + 1;
                q.push({ss, pp + 2});
            }
            swap(ss[pp], ss[pp + 2]);
        }
    }
    return 0;
}

int main() {
    string str1 = "aba_a", str2 = "_baaa";
    cout << "Minimum required moves: " << transformString(str1, str2) << endl;
    return 0;
}

आउटपुट

Minimum required moves: 2
  1. - C++ में दो संख्यात्मक स्ट्रिंग्स को समान बनाने की न्यूनतम लागत

    मान लीजिए हमारे पास दो संख्यात्मक स्ट्रिंग्स A और B हैं। हमें A और B को समान बनाने की न्यूनतम लागत ढूंढनी है। हम केवल एक ऑपरेशन कर सकते हैं, वह है स्ट्रिंग से अंक हटाना, एक अंक हटाने की लागत अंक के मान के समान है। मान लीजिए स्ट्रिंग A = 6789, B = 7859, तब हमें A से 6 हटाना होगा, और B से 5 हटाना होगा

  1. - C++ में डिलीशन के बिना दो स्ट्रिंग्स को एनाग्राम बनाने के लिए न्यूनतम मैनिपुलेशन

    मान लीजिए हमारे पास समान लंबाई की दो स्ट्रिंग्स हैं, हमें बिना किसी कैरेक्टर को डिलीट किए दो स्ट्रिंग्स को एनाग्राम बनाने के लिए आवश्यक न्यूनतम परिवर्तनों की संख्या ढूंढनी है। एनाग्राम दो स्ट्रिंग्स होती हैं जिनमें कैरेक्टर्स का समान सेट होता है। मान लीजिए दो स्ट्रिंग्स HELLO और WORLD हैं, यहां आवश्

  1. - पायथन में दो स्ट्रिंग्स को बराबर बनाने के लिए आवश्यक न्यूनतम प्रीप्रोसेसिंग चालें खोजें

    मान लीजिए हमारे पास केवल निचले मामले के अक्षरों वाली समान लंबाई की दो स्ट्रिंग्स P और Q हैं, हमें स्ट्रिंग P पर आवश्यक न्यूनतम प्री-प्रोसेसिंग चालों की गिनती करनी है ताकि नीचे दिए गए ऑपरेशंस लागू करने के बाद यह स्ट्रिंग Q के बराबर हो जाए:कोई भी इंडेक्स i चुनें और वर्ण pi और qi को स्वैप करें।कोई भी इ