मान लीजिए कि हमारे पास एक स्ट्रिंग है। हम इसे हैप्पी स्ट्रिंग कहेंगे जब इसमें केवल ['a', 'b', 'c'] अक्षर, और s[i] !=s[i + 1] 1 से लेकर लंबाई तक के सभी मानों के लिए हों। s - 1 (यहां स्ट्रिंग 1-अनुक्रमित है)।
इसलिए, यदि हमारे पास दो पूर्णांक n और k हैं, तो लेक्सिकोग्राफिक क्रम में क्रमबद्ध n लंबाई के सभी खुश तारों की एक सूची पर विचार करें। हमें इस सूची की kth स्ट्रिंग ढूंढनी होगी या n लंबाई के k हैप्पी स्ट्रिंग्स से कम होने पर एक खाली स्ट्रिंग लौटानी होगी
इसलिए, यदि इनपुट n =3 और k =9 जैसा है, तो आउटपुट "कैब" होगा, 12 अलग-अलग खुश तार हैं, ये हैं ["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"], नौवां "कैब" है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक सरणी रिट परिभाषित करें
-
एक फ़ंक्शन हल करें () को परिभाषित करें, इसमें s लगेगा, l इसे 1 से प्रारंभ करें,
-
यदि l, x के समान है, तो −
-
रिट के अंत में s डालें
-
वापसी
-
-
इनिशियलाइज़ करने के लिए मैं :=0, जब i <3, अपडेट (i 1 से बढ़ाएँ), करें -
-
यदि s का अंतिम अवयव c[i] के बराबर नहीं है, तो -
-
हल करें (एस + सी [i], एल + 1)
-
-
-
मुख्य विधि से, निम्न कार्य करें -
-
एक्स:=एन
-
यदि n, 0 के समान है, तो -
-
खाली स्ट्रिंग लौटाएं
-
-
हल करें ("ए")
-
हल करें ("बी")
-
हल करें ("सी")
-
सरणी को क्रमबद्ध करें रिट
-
वापसी (यदि k> रिट का आकार, फिर रिक्त स्ट्रिंग, अन्यथा ret[k - 1])
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
struct Cmp{
bool operator()(string& a, string& b) {
return !(a < b);
}
};
char c[3] = {'a', 'b', 'c'};
class Solution {
public:
vector<string> ret;
int x;
void solve(string s, int l = 1){
if (l == x) {
ret.push_back(s);
return;
}
for (int i = 0; i < 3; i++) {
if (s.back() != c[i]) {
solve(s + c[i], l + 1);
}
}
}
string getHappyString(int n, int k){
x = n;
if (n == 0)
return "";
solve("a");
solve("b");
solve("c");
sort(ret.begin(), ret.end());
return k > ret.size() ? "" : ret[k - 1];
}
};
main(){
Solution ob;
cout << (ob.getHappyString(3,9));
} इनपुट
3,9
आउटपुट
cab