ในปัญหานี้ เราได้รับจำนวนบวก 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