ในปัญหานี้ เราได้รับสตริงและจำนวนเต็ม M หน้าที่ของเราคือพิมพ์สตริงวงกลมที่มีความยาว M อย่างชัดเจนทั้งหมดตามลำดับศัพท์ (ลำดับตามตัวอักษร)
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
Input: str= “ssssn” M=3 Output: nss sns ssn sss
คำอธิบาย สตริงวงกลมที่เป็นไปได้ทั้งหมดที่มีความยาว 3 ได้แก่ sss sss ssn sns nss องค์ประกอบที่แตกต่างในลำดับศัพท์คือ sss ssn sns nss
เพื่อแก้ปัญหานี้ เราจะวนซ้ำองค์ประกอบของสตริงและสร้างสตริงย่อยที่เป็นไปได้ทั้งหมดที่มีความยาว M เราจะเก็บสตริงที่สร้างขึ้นนี้ไว้ในชุดที่เก็บองค์ประกอบที่แตกต่างกันเท่านั้นและละทิ้งรายการซ้ำ มันจะเก็บองค์ประกอบเหล่านี้ในลำดับศัพท์ พิมพ์องค์ประกอบทั้งหมดของชุดตั้งแต่ต้น
อัลกอริทึมนี้จะขึ้นอยู่กับทั้งขนาดของสตริงย่อยและความยาวของสตริง ความซับซ้อนของเวลา =O(N*M) .
ตัวอย่าง
รหัสนี้แสดงการใช้งานโซลูชันของเรา -
#include <bits/stdc++.h> using namespace std; void printCircularString(string s, int l, int m) { set<string> circularString; s = s + s; for (int i = 0; i < l; i++) { circularString.insert(s.substr(i, m)); } while (!circularString.empty()) { cout<<*circularString.begin()<<"\t"; circularString.erase(circularString.begin()); } } int main() { string str = "ssssn"; int N = str.length(); int M = 3; cout<<"All circular strings of length "<<M<<" from the string '"<<str<<"' are:\n"; printCircularString(str, N, M); return 0; }
ผลลัพธ์
All circular strings of length 3 from the string 'ssssn' are − nss sns ssn sss