Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาสตริงไบนารีที่ n ตามลำดับการจัดเรียงใน C++


ในปัญหานี้ เราได้รับจำนวนบวก 1 หน้าที่ของเราคือค้นหาสตริงไบนารี Nth ในการเรียงลำดับ

เราจำเป็นต้องค้นหาสตริงที่ N ในรายการสตริงที่ไม่มีที่สิ้นสุดที่สร้างขึ้นโดยใช้เพียงสองสัญลักษณ์ a และ b ที่เรียงลำดับตามพจนานุกรม

รายการคือ −

a, b, aa, ab, ba, bb, aaa, aab, aba, …

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input : N = 8
Output : aab

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาอย่างง่ายคือการใช้ลูปเพื่อสร้างสตริง n ทั้งหมด แล้วส่งคืนสตริงที่ N วิธีนี้ใช้ได้ผลแต่ไม่สามารถให้วิธีแก้ปัญหาที่มีประสิทธิภาพในกรณีที่ N

ดังนั้นเราจะเห็นโซลูชันอื่นที่สามารถให้วิธีแก้ปัญหาได้ในเวลาอันสั้น

อีกวิธีในการแก้ปัญหาคือการใช้ดัชนีสัมพัทธ์สำหรับสตริง โดยใช้ข้อเท็จจริงที่ว่าจำนวนสตริงที่มีความยาว N สามารถสร้างได้โดยใช้สัญลักษณ์ 2 ตัวคือ 2N ดัชนีสัมพัทธ์สามารถใช้เพื่อค้นหา แบบฟอร์มไบนารี สตริง

ดัชนีสัมพัทธ์ =N + 1 - 2( floor(log(N+1)) )

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
string findBinString(ll n){
   ll len = (int)log2(n + 1);
   int ri = n + 1 - pow(2, len);
   ll i = 0;
   string binString = "";
   for (i = 0; i < len; i++) {
      binString += 'a';
   }
   i = 0;
   while (ri > 0) {
      if (ri % 2 == 1)
         binString[i] = 'b';
      ri /= 2;
      i++;
   }
   reverse(binString.begin(), binString.end());
   return binString;
}
int main(){
   ll n = 245;
   cout<<"The "<<n<<"-th binary string in sorted order is "<<findBinString(n);
   return 0;
}

ผลลัพธ์

The 245-th binary string in sorted order is bbbabba