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

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

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

इसलिए, यदि इनपुट A ="abc", B ="bac" जैसा है, तो आउटपुट 2 होगा।

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

  • फ़ंक्शन स्वैप () को परिभाषित करें, यह स्ट्रिंग s, i, j,

    लेगा
  • एक्स:=एस[i], वाई:=एस[जे]

  • s[i] :=y, s[j] :=x

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

  • अगर ए, बी के समान है, तो:, 0 लौटाएं

  • देखे गए एक सेट को परिभाषित करें

  • विज़िट किए गए में A डालें

  • एक कतार q को परिभाषित करें, A को q में डालें

  • lvl को इनिशियलाइज़ करने के लिए:=1, जब q खाली न हो, तो अपडेट करें (lvl को 1 से बढ़ाएँ), करें -

    • sz :=q का आकार

    • जबकि sz गैर-शून्य है, प्रत्येक पुनरावृत्ति में sz को 1 से घटाएं, करें -

      • curr :=q का पहला तत्व

      • q से तत्व हटाएं

      • मैं :=0

      • जबकि (i

        • (मैं 1 से बढ़ाइए)

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

        • अगर curr[i], curr[j] के समान है, तो -

          • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

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

          • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

        • अगर curr[j] B[j] के समान है, तो -

          • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

        • स्वैप (करंट, आई, जे)

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

          • वापसी एलवीएल

        • यदि विज़िट की गई कॉल काउंट (कर) नहीं है, तो -

          • विज़िट किए गए में curr डालें

          • क्यू में कर्व डालें

        • स्वैप (करंट, आई, जे)

  • वापसी -1

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

उदाहरण

#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;
               swapp(curr, i, j);
               if (curr == B)
               return lvl;
               if (!visited.count(curr)) {
                  visited.insert(curr);
                  q.push(curr);
               }
               swapp(curr, i, j);
            }
         }
      }
      return -1;
   }
   void swapp(string &s, int i, int j) {
      char x = s[i];
      char y = s[j];
      s[i] = y;
      s[j] = x;
   }
};
main(){
   Solution ob;
   cout << (ob.kSimilarity("abc", "bac"));
}

इनपुट

"abc", "bac"

आउटपुट

1

  1. सी/सी++ में strcmp ()

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

  1. सी++ में सबसे बड़ा बीएसटी सबट्री

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इसका सबसे बड़ा सबट्री ढूंढ़ना होगा जहां सबसे बड़ा मतलब सबट्री जिसमें सबसे बड़ी संख्या में नोड्स हों। तो, अगर इनपुट पसंद है, तो आउटपुट 3 होगा, क्योंकि इस मामले में सबसे बड़ा बीएसटी सबट्री हाइलाइट किया गया है। इसे हल करने के लिए, हम इन चरणों का पालन करे

  1. C++ में K-समान स्ट्रिंग्स के लिए K का मान ज्ञात करने का कार्यक्रम

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