ধরুন আমাদের একটি স্ট্রিং আছে। আমরা এটিকে একটি সুখী স্ট্রিং বলব যখন এটি শুধুমাত্র ['a', 'b', 'c'] অক্ষর এবং s[i]!=s[i + 1] এর 1 থেকে দৈর্ঘ্য পর্যন্ত সমস্ত মানের জন্য থাকে। s - 1 (এখানে স্ট্রিংটি 1-সূচীযুক্ত)।
সুতরাং, যদি আমাদের দুটি পূর্ণসংখ্যা n এবং k থাকে, তাহলে আভিধানিক ক্রম অনুসারে n দৈর্ঘ্যের সমস্ত সুখী স্ট্রিংগুলির একটি তালিকা বিবেচনা করুন। আমাদের এই তালিকার kth স্ট্রিং খুঁজে বের করতে হবে অথবা n দৈর্ঘ্যের k হ্যাপি স্ট্রিং কম থাকলে একটি খালি স্ট্রিং ফেরত দিতে হবে।
সুতরাং, যদি ইনপুটটি n =3 এবং k =9 এর মত হয়, তাহলে আউটপুট হবে "cab", 12টি ভিন্ন হ্যাপি স্ট্রিং আছে, এগুলো হল ["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"], 9মটি হল "cab"।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি অ্যারে ret সংজ্ঞায়িত করুন
-
একটি ফাংশন solve() সংজ্ঞায়িত করুন, এটি s লাগবে, l এটি 1 দিয়ে আরম্ভ করুন,
-
যদি l x এর সমান হয়, তাহলে −
-
ret এর শেষে s ঢোকান
-
ফেরত
-
-
আরম্ভ করার জন্য i :=0, যখন i <3, আপডেট করুন (i 1 দ্বারা বাড়ান), −
-
যদি s এর শেষ উপাদানটি c[i] এর সমান না হয়, তাহলে −
-
সমাধান (s + c[i], l + 1)
-
-
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
x :=n
-
যদি n 0 এর সমান হয়, তাহলে −
-
খালি স্ট্রিং ফেরত দিন
-
-
সমাধান("a")
-
সমাধান("b")
-
সমাধান("c")
-
অ্যারে ret সাজান
-
প্রত্যাবর্তন (যদি k> ret এর আকার, তারপর ফাঁকা স্ট্রিং, অন্যথায় 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