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

समान स्ट्रिंग समूह C++ में

मान लीजिए हमारे पास दो स्ट्रिंग्स X और Y हैं, ये समान हैं यदि हम X के दो अक्षरों को स्वैप करके Y के बराबर बना सकते हैं। इसके अलावा, दो स्ट्रिंग्स X और Y समान हैं यदि वे बराबर हैं। उदाहरण के लिए, "tars" और "rats" समान हैं, "rats" और "arts" समान हैं, लेकिन "star", "tars", "rats", या "arts" के समान नहीं है। ये समानता द्वारा दो कनेक्टेड समूह बनाते हैं: {"tars", "rats", "arts"} और {"star"}.

मान लीजिए हमारे पास स्ट्रिंग्स की एक सूची A है। A में हर स्ट्रिंग A की हर दूसरी स्ट्रिंग का एनाग्राम है। हमें ढूंढना है कि कितने समूह हैं?

उदाहरण के लिए, यदि इनपुट ["tars","rats","arts","star"] है, तो आउटपुट 2 होगा।

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

हम समान स्ट्रिंग्स को जोड़ने के लिए यूनियन-फाइंड का उपयोग करते हैं:

  • दो स्ट्रिंग्स समान हैं यदि वे अधिकतम 2 स्थितियों में भिन्न हैं

  • पथ संपीड़न और यूनियन बाय रैंक के साथ DSU इनिशियलाइज़ करें

  • सभी जोड़ियों (i, j) के लिए, यदि समान हैं तो यूनियन करें

  • अंत में अद्वितीय पैरेंट की संख्या गिनें

उदाहरण

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

void print_vector(vector<auto> v){ 
    cout << "["; 
    for(int i = 0; i<v.size(); i++){ 
        cout << v[i] << ", "; 
    } 
    cout << "]"<<endl; 
} 

class Solution { 
public: 
    vector<int> parent; 
    vector<int> rank; 
    
    int getParent(int x){ 
        if (parent[x] == -1) return x; 
        return parent[x] = getParent(parent[x]); 
    } 
    
    bool unionn(int x, int y){ 
        int parX = getParent(x); 
        int parY = getParent(y); 
        if (parX == parY) return false; 
        if (rank[parX] >= rank[parY]) { 
            rank[parX] += rank[parY]; 
            parent[parY] = parX; 
        } else { 
            rank[parY] += rank[parX]; 
            parent[parX] = parY; 
        } 
        return true; 
    } 
    
    bool ok(string& s1, string& s2){ 
        int cnt = 0; 
        for (int i = 0; i < s1.size(); i++) { 
            if (s1[i] != s2[i]) cnt++; 
            if (cnt > 2) return false; 
        } 
        return true; 
    } 
    
    int numSimilarGroups(vector<string>& A){ 
        int ret = 0; 
        int n = A.size(); 
        ret = n; 
        parent = vector<int>(n, -1); 
        rank = vector<int>(n, 1); 
        
        for (int i = 0; i < n; i++) { 
            for (int j = i + 1; j < n; j++) { 
                if (ok(A[i], A[j])) { 
                    if (unionn(i, j)) ret--; 
                } 
            } 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<string> v = {"tars","rats","arts","star"}; 
    cout << (ob.numSimilarGroups(v)); 
    return 0;
}

इनपुट

{"tars","rats","arts","star"}

आउटपुट

2
  1. - C++ में String at() फंक्शन

    सारांश यह संक्षिप्त ट्यूटोरियल स्ट्रिंग से कैरेक्टर्स के अनुक्रम को एक्सेस करने के लिए C++ स्ट्रिंग क्लास at() फंक्शनैलिटी का अवलोकन है। आगामी सेक्शन में, एक इच्छुक पाठक स्ट्रिंग क्लास प्रोग्रामिंग उदाहरणों के माध्यम से at() फंक्शन्स के मैनिपुलेशन की पूरी समझ प्राप्त कर सकता है। स्ट्रिंग क्लास प्रोग

  1. - C++ में स्ट्रिंग को टोकनाइज़ करना

    इस खंड में, हम देखेंगे कि C++ में स्ट्रिंग्स को कैसे टोकनाइज़ किया जाए। C में हम कैरेक्टर सरणी के लिए strtok() फंक्शन का उपयोग कर सकते हैं। यहां हमारे पास एक स्ट्रिंग क्लास है। अब हम देखेंगे कि उस स्ट्रिंग से किसी डिलीमीटर का उपयोग करके स्ट्रिंग को कैसे काटा जाए। C++ सुविधा का उपयोग करने के लिए, हम

  1. - C++ में स्ट्रिंग को टोकनाइज़ कैसे करें?

    पहला तरीका शब्दों को स्पेस से अलग करके पढ़ने के लिए stringstream का उपयोग करना है। यह थोड़ा सीमित है लेकिन अगर आप उचित चेक प्रदान करते हैं तो यह कार्य काफी अच्छी तरह से करता है। उदाहरण #include <vector> #include <string> #include <sstream> using namespace std; int main() {