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

C++ में कम से कम K दोहराए जाने वाले वर्णों के साथ सबसे लंबा सबस्ट्रिंग


मान लीजिए कि हमारे पास एक स्ट्रिंग s है, और हमें उस दिए गए स्ट्रिंग (केवल लोअरकेस अक्षरों से मिलकर) के सबसे लंबे सबस्ट्रिंग T की लंबाई का पता लगाना है, ताकि T में प्रत्येक वर्ण कम दिखाई न दे कश्मीर टाइम्स से। इसलिए यदि स्ट्रिंग "ababbc" और k =2 है, तो आउटपुट 3 होगा और सबसे लंबा सबस्ट्रिंग "ababb" होगा, क्योंकि दो a और तीन b हैं।

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

  • एक पुनरावर्ती फ़ंक्शन बनाएं जिसे सबसे लंबा सबस्ट्रिंग () कहा जाता है, इसमें स्ट्रिंग s और आकार k होता है
  • अगर k =1 है, तो स्ट्रिंग का आकार लौटाएं
  • यदि स्ट्रिंग का आकार
  • 26 आकार की एक सरणी c बनाएं, और इसे -1 से भरें
  • n :=स्ट्रिंग का आकार
  • मैं के लिए 0 से n की सीमा में
    • यदि c[s[i] - 'a'] =-1, तो c[s[i] - 'a'] :=1, अन्यथा c[s[i] - 'a'] को 1 से बढ़ा दें।
  • badChar :='*'
  • मैं के लिए 0 से 25 की सीमा में
    • यदि c[i] -1 नहीं है और c[i]
  • अगर badChar ='*', तो n लौटाएं
  • v :=badChar का उपयोग करके मूल स्ट्रिंग को विभाजित करके स्ट्रिंग्स की एक और सरणी
  • उत्तर:=0
  • i के लिए 0 से v के आकार के बीच
    • उत्तर :=अधिकतम उत्तर और सबसे लंबा सबस्ट्रिंग(v[i], k)
  • वापसी उत्तर

उदाहरण(C++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector <string> splitString(string s, char x){
      string temp = "";
      vector <string> res;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == x){
            if(temp.size())res.push_back(temp);
            temp = "";
         }
         else temp += s[i];
      }
      if(temp.size())res.push_back(temp);
      return res;
   }
   int longestSubstring(string s, int k) {
      if(k == 1)return s.size();
      if(s.size() < k )return 0;
      vector <int> cnt(26, -1);
      int n = s.size();
      for(int i = 0; i < n; i++){
         if(cnt[s[i] - 'a'] == -1) cnt[s[i] - 'a'] = 1;
         else cnt[s[i] - 'a']++;
      }
      char badChar = '*';
      for(int i = 0; i < 26; i++){
         if(cnt[i] != -1 && cnt[i] < k){
            badChar = i + 'a';
            break;
         }
      }
      if(badChar == '*')return n;
      vector <string> xx = splitString(s, badChar);
      int ans = 0;
      for(int i = 0; i < xx.size(); i++)ans = max(ans, longestSubstring(xx[i], k));
      return ans;
   }
};
   main(){
   Solution ob;
   cout << ob.longestSubstring("ababbc", 2);
}

इनपुट

"ababbc"
2

आउटपुट

5

  1. पायथन में एक स्ट्रिंग में सबसे लंबे समय तक दोहराए जाने वाले सबस्ट्रिंग की लंबाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक लोअरकेस स्ट्रिंग s है, हमें सबसे लंबे सबस्ट्रिंग की लंबाई ज्ञात करनी है जो s में कम से कम दो बार आती है। अगर हमें ऐसी स्ट्रिंग नहीं मिलती है, तो 0 पर लौटें। इसलिए, यदि इनपुट s =abdgoalputabdtypeabd जैसा है, तो आउटपुट 3 होगा, क्योंकि एक से अधिक बार होने वाला सबसे लंबा सबस्ट

  1. पायथन में दिए गए स्ट्रिंग में k अद्वितीय वर्णों के साथ सबसे लंबा विकल्प खोजें

    मान लीजिए कि हमारे पास एक स्ट्रिंग है जो हमें सबसे लंबे संभव सबस्ट्रिंग को वापस करना है जिसमें अद्वितीय वर्णों की संख्या k है, यदि सबसे लंबी संभव लंबाई के एक से अधिक सबस्ट्रिंग हैं, तो उनमें से किसी को वापस कर दें। इसलिए, यदि इनपुट s =ppqprqtqtqt, k =3 जैसा है, तो आउटपुट rqtqtqt होगा क्योंकि इसकी

  1. पायथन में वर्णों को दोहराए बिना सबसे लंबा सबस्ट्रिंग

    मान लीजिए कि हमारे पास एक स्ट्रिंग है। हमें पात्रों को दोहराए बिना सबसे लंबा विकल्प खोजना होगा। तो अगर स्ट्रिंग ABCABCBB की तरह है, तो परिणाम 3 होगा, क्योंकि एक सबस्ट्रिंग है जो दोहरा रही है, लंबाई 3 की है। वह एबीसी है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे सेट i :=0, j :=0, जानकारी स्टोर