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

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

मान लीजिए कि हमारे पास दो स्ट्रिंग्स एक्स और वाई हैं, ये समान हैं यदि हम एक्स के दो अक्षरों को स्वैप कर सकते हैं, ताकि यह वाई के बराबर हो। साथ ही दो स्ट्रिंग्स एक्स और वाई समान हैं यदि वे बराबर हैं। एक उदाहरण के रूप में, विचार करें, दो तार "टार" की तरह हैं और "चूहे" समान हैं, यदि हम टी और आर को स्वैप करते हैं, तो हम एक और पा सकते हैं, अब "चूहे" और "कला" समान हैं, लेकिन "स्टार" नहीं है "टार", "चूहों", या "कला" के समान। अब हम देख सकते हैं, ये समानता से दो जुड़े हुए समूह बनाते हैं:{"tars", "rats", "arts"} और {"star"}। यहां "टार" और "कला" एक ही समूह में हैं, भले ही वे समान न हों। तो, प्रत्येक समूह ऐसा है कि एक शब्द समूह में है यदि और केवल यदि वह समूह में कम से कम एक अन्य शब्द के समान है। मान लीजिए कि हमारे पास स्ट्रिंग्स की एक सूची ए है। ए में प्रत्येक स्ट्रिंग ए में हर दूसरे स्ट्रिंग का विपर्यय है। हमें यह पता लगाना है कि कितने समूह हैं?

इसलिए, यदि इनपुट ["tars",,"rats",,"arts",,"star"] जैसा है, तो आउटपुट 2

होगा

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • सरणी पैरेंट को परिभाषित करें

  • एक सरणी रैंक परिभाषित करें

  • getParent() फ़ंक्शन को परिभाषित करें, इसमें x लगेगा,

    • अगर माता-पिता [x] -1 के समान है, तो -

      • वापसी x

    • वापसी माता-पिता [x] =getParent (माता-पिता [x])

  • एक फ़ंक्शन को परिभाषित करें Unionn(), इसमें x, y,

    लगेगा
    • parX:=getParent(x), parY:=getParent(y)

    • यदि parX, parY के समान है, तो -

      • झूठी वापसी

    • अगर रैंक [parX]>=रैंक [parY], तो −

      • रैंक [parX]:=रैंक [parX] + रैंक [parY]

      • माता-पिता [parY] :=parX

    • अन्यथा

      • रैंक [parY] :=रैंक [parY] + रैंक [parX]

      • पैरेंट [parX] :=parY

    • सही लौटें

  • फ़ंक्शन को परिभाषित करें ठीक (), इसमें s1, s2,

    लगेगा
    • सीएनटी:=0

    • इनिशियलाइज़ i :=0 के लिए, जब i

      • अगर s1[i], s2[i] के बराबर नहीं है, तो -

        • (cnt 1 से बढ़ाएँ)

      • अगर cnt> 2, तो -

        • झूठी वापसी

    • सही लौटें

  • मुख्य विधि से, निम्न कार्य करें -

  • रिट:=0

  • n :=A का आकार

  • रिट :=n

  • पैरेंट :=आकार n की एक सरणी, और इसे -1 से भरें

  • रैंक:=आकार n की एक सरणी, और इसे 1 से भरें

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • इनिशियलाइज़ j :=i + 1 के लिए, जब j

      • अगर ठीक है (ए [i], ए [जे]) शून्य नहीं है, तो -

        • अगर Unionn(i, j) गैर-शून्य है, तो -

          • (रिटर्न 1 से घटाएं)

  • वापसी रिट

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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;
   }
};
main(){
   Solution ob;
   vector<string> v = {"tars","rats","arts","star"};
   cout << (ob.numSimilarGroups(v));
}

इनपुट

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

आउटपुट

2

  1. सी++ में () पर स्ट्रिंग

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

  1. सी ++ में एक स्ट्रिंग को टोकन करना

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

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

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