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

सी++ में वर्ड को स्पेल करने के लिए स्टिकर्स

मान लीजिए कि हमारे पास N विभिन्न प्रकार के स्टिकर हैं। प्रत्येक प्रकार के स्टिकर में एक लोअरकेस अंग्रेजी शब्द होता है। हम स्टिकर के हमारे संग्रह से अलग-अलग अक्षरों को काटकर और उन्हें पुनर्व्यवस्थित करके दिए गए लक्ष्य स्ट्रिंग को स्पष्ट करना चाहते हैं। यदि आवश्यक हो तो हम प्रत्येक स्टिकर का एक से अधिक बार उपयोग कर सकते हैं, और हमारे पास प्रत्येक स्टिकर की अनंत मात्रा है।

हमें स्टिकर्स की न्यूनतम संख्या ज्ञात करनी है जो हमें लक्ष्य को स्पष्ट करने के लिए चाहिए? यदि कार्य असंभव है, तो -1 लौटें।

तो अगर इनपुट ["कुत्ता", "वाक्य", "एंटीना"] जैसा है, और लक्ष्य "नृत्य" है, तो उत्तर 3

होगा

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

  • n :=लक्ष्य का आकार
  • N :=1 को बाईं ओर n बार शिफ्ट करें
  • आकार एन के एक सरणी डीपी को परिभाषित करें इसे inf के साथ प्रारंभ करें
  • dp[0] :=0
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • यदि dp[i], inf के समान है, तो −
    • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
  • इनिशियलाइज़ j :=0 के लिए, जब j <स्टिकर का आकार, अपडेट करें (1 से j बढ़ाएँ), −
      करें
    • s :=स्टिकर[j]
    • x :=मैं
    • इनिशियलाइज़ k :=0 के लिए, जब k
    • z :=s[k]
    • इनिशियलाइज़ l :=0 के लिए, जब l <लक्ष्य का आकार, अपडेट करें (l को 1 से बढ़ाएँ), −
        करें
      • यदि लक्ष्य [l] z के समान है और (दाएं स्थानांतरण x, l बिट्स) और 1) 0 के समान है, तो −
        • x :=x OR (1 को बाएँ l बिट्स में शिफ्ट करें)
        • लूप से बाहर आएं
  • dp[x] :=न्यूनतम dp[x] और dp[i] + 1
  • रिटर्न dp[N - 1] inf है तो -1 के साथ सेट करें अन्यथा dp[N - 1] के साथ सेट करें
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int minStickers(vector<string>& stickers, string target) {
          int n = target.size();
          int N = 1 << n;
          vector <int> dp(N, INT_MAX);
          dp[0] = 0;
          for(int i = 0; i < N; i++){
             if(dp[i] == INT_MAX) continue;
             for(int j = 0; j < stickers.size(); j++){
                string s = stickers[j];
                int x = i;
                for(int k = 0; k < s.size(); k++){
                   char z = s[k];
                   for(int l = 0; l < target.size(); l++){
                      if(target[l] == z && ((x >> l) & 1) == 0){
                         x |= (1 << l);
                         break;
                      }
                   }
                }
                dp[x] = min(dp[x], dp[i] + 1);
             }
          }
          return dp[N - 1] == INT_MAX? -1 : dp[N - 1];
       }
    };
    main(){
       Solution ob;
       vector<string> v = {"dog", "sentence","antenna"};
       cout << (ob.minStickers(v, "dance"));
    }

    इनपुट

    ["dog", "sentence","antenna"]
    "dance"

    आउटपुट

    3

    1. सी++ में बीके ट्री परिचय

      बीके ट्री या बर्कहार्ड ट्री एक डेटा संरचना का एक रूप है जो आमतौर पर लेवेनशेटिन दूरी के आधार पर वर्तनी जांच करने के लिए उपयोग किया जाता है। इसका उपयोग स्ट्रिंग मिलान के लिए भी किया जाता है स्वत:सुधार सुविधा का उपयोग इस डेटा संरचना को बनाने के लिए किया जा सकता है। मान लीजिए कि हमारे पास एक शब्दकोश में

    1. सी ++ प्रोग्राम शब्द से फ़ाइल शब्द पढ़ने के लिए?

      इस खंड में हम देखेंगे कि कैसे हम C++ का उपयोग करके फ़ाइल सामग्री को शब्द दर शब्द पढ़ सकते हैं। कार्य बहुत सरल है। फ़ाइल सामग्री को पढ़ने के लिए हमें फ़ाइल इनपुट स्ट्रीम का उपयोग करना होगा। फ़ाइल स्ट्रीम फ़ाइल नाम का उपयोग करके फ़ाइल खोलेगी, फिर फ़ाइलस्ट्रीम का उपयोग करके, प्रत्येक शब्द को लोड करें औ

    1. ठीक करें:वर्ड में वर्तनी जांच काम नहीं कर रही है

      माइक्रोसॉफ्ट वर्ड माइक्रोसॉफ्ट द्वारा विकसित एक वर्ड प्रोसेसर है। यह लगभग दशकों से है और दुनिया भर में सबसे अधिक उपयोग किया जाने वाला कार्यालय अनुप्रयोग है। यह विभिन्न मुद्दों को लक्षित करने और विभिन्न सुविधाओं में सुधार करने के लिए स्वयं Microsoft से समय-समय पर अद्यतन प्राप्त करता है। Microsoft Wo