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

K-समान स्ट्रिंग्स C++ में

मान लीजिए हमारे पास दो स्ट्रिंग्स A और B हैं। ये दो स्ट्रिंग्स K-समान हैं (जहां K एक गैर-ऋणात्मक पूर्णांक है) यदि हम A में दो अक्षरों की स्थितियों को ठीक K बार स्वैप कर सकते हैं ताकि परिणामी स्ट्रिंग B हो जाए। तो, हमारे पास दो एनाग्राम A और B हैं, हमें सबसे छोटा K ढूंढना है जिसके लिए A और B K-समान हैं।

उदाहरण के लिए, यदि A = "abc", B = "bac", तो आउटपुट 1 होगा।

हल करने का दृष्टिकोण

हम प्रूनिंग के साथ BFS का उपयोग करते हैं:

  • यदि A == B, तो 0 वापस करें

  • विज़िटेड स्ट्रिंग्स के लिए सेट और BFS के लिए क्यू का उपयोग करें

  • प्रत्येक स्तर पर, सभी स्ट्रिंग्स को संसाधित करें

  • पहला बेमेल सूचकांक i ढूंढें

  • j > i के लिए स्वैप आजमाएं जहां curr[j] == B[i] और curr[j] != B[j]

  • यदि स्वैप के बाद B से मेल खाता है, तो स्तर वापस करें

  • अन्यथा, यदि विज़िट नहीं किया गया है, तो क्यू में जोड़ें

उदाहरण

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

class Solution { 
public: 
    int kSimilarity(string A, string B) { 
        if (A == B) return 0; 
        unordered_set<string> visited; 
        visited.insert(A); 
        queue<string> q; 
        q.push(A); 
        
        for (int lvl = 1; !q.empty(); lvl++) { 
            int sz = q.size(); 
            while (sz--) { 
                string curr = q.front(); 
                q.pop(); 
                int i = 0; 
                while (i < curr.size() && curr[i] == B[i]) i++; 
                
                for (int j = i + 1; j < curr.size(); j++) { 
                    if (curr[i] == curr[j]) continue; 
                    if (curr[j] != B[i]) continue; 
                    if (curr[j] == B[j]) continue; 
                    
                    swap(curr[i], curr[j]); 
                    if (curr == B) return lvl; 
                    if (!visited.count(curr)) { 
                        visited.insert(curr); 
                        q.push(curr); 
                    } 
                    swap(curr[i], curr[j]); 
                } 
            } 
        } 
        return -1; 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.kSimilarity("abc", "bac")); 
    return 0;
}

इनपुट

"abc", "bac"

आउटपुट

1
  1. - C/C++ में strcmp() फ़ंक्शन

    strcmp() फ़ंक्शन एक बिल्ट-इन लाइब्रेरी फ़ंक्शन है और यह string.h हेडर फ़ाइल में घोषित है। इस फ़ंक्शन का उपयोग स्ट्रिंग आर्गुमेंट्स की तुलना करने के लिए किया जाता है। यह स्ट्रिंग्स की शब्दकोशीय तुलना करता है, जिसका अर्थ है कि यह दोनों स्ट्रिंग्स की तुलना कैरेक्टर दर कैरेक्टर करता है। यह स्ट्रिंग्स के

  1. C++ में सबसे बड़ा BST सबट्री - अधिकतम नोड्स वाला BST खोजें C++ में सबसे बड़ा BST सबट्री - अधिकतम नोड्स वाला BST खोजें

    समस्या विवरण मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उसका सबसे बड़ा सबट्री ढूंढना है जहां सबसे बड़ा का अर्थ है सबसे अधिक नोड्स वाला सबट्री। उदाहरण के लिए, यदि इनपुट इस तरह का ट्री है: तो आउटपुट 3 होगा, क्योंकि इस मामले में सबसे बड़ा BST सबट्री हाइलाइट किया गया है। समाधान दृष्टिकोण पोस्ट-ऑर्ड

  1. - C++ में K-समान स्ट्रिंग्स के लिए K का मान खोजने का प्रोग्राम

    मान लीजिए हमारे पास दो स्ट्रिंग्स s और t हैं। ये दो स्ट्रिंग्स K-समान हैं जब हम s में दो अक्षरों की पोजीशन को स्वैप करके ठीक K बार कर सकते हैं ताकि परिणामी स्ट्रिंग t हो। हमारे पास दो एनाग्राम s और t हैं, और हमें सबसे छोटा K ढूंढना है जिसके लिए s और t K-समान हैं। उदाहरण के लिए, यदि इनपुट s = abc, t