Computer >> Máy Tính >  >> Lập trình >> C ++

Chuỗi từ vựng thứ k của tất cả các chuỗi hạnh phúc có độ dài n trong C ++

Giả sử chúng ta có một chuỗi. Chúng ta sẽ gọi đó là một chuỗi hạnh phúc khi nó chỉ bao gồm các chữ cái ['a', 'b', 'c'] và s [i]! =S [i + 1] cho tất cả các giá trị của i từ 1 đến độ dài của s - 1 (ở đây chuỗi được lập chỉ mục 1).

Vì vậy, nếu chúng ta có hai số nguyên n và k, hãy xem xét một danh sách tất cả các chuỗi hạnh phúc có độ dài n được sắp xếp theo thứ tự từ vựng. Chúng ta phải tìm chuỗi thứ k của danh sách này hoặc trả về một chuỗi rỗng nếu có ít hơn k chuỗi hạnh phúc có độ dài n

Vì vậy, nếu đầu vào là n =3 và k =9, thì đầu ra sẽ là "cab", có 12 chuỗi hạnh phúc khác nhau, đó là ["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"], câu thứ 9 là "cab".

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định ret mảng

  • Xác định một hàm giải quyết (), điều này sẽ mất s, l khởi tạo nó bằng 1,

  • nếu l giống với x, thì -

    • chèn s vào cuối ret

    • trở lại

  • để khởi tạo i:=0, khi i <3, hãy cập nhật (tăng i lên 1), thực hiện -

    • nếu phần tử cuối cùng của s không bằng c [i] thì -

      • giải quyết (s + c [i], l + 1)

  • Từ phương thức chính, thực hiện như sau -

  • x:=n

  • nếu n giống 0 thì -

    • trả về chuỗi trống

  • giải quyết ("a")

  • giải quyết ("b")

  • giải quyết ("c")

  • sắp xếp lại mảng

  • return (nếu k> kích thước của ret thì chuỗi trống, nếu không thì ret [k - 1])

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

3,9

Đầu ra

cab