ในปัญหานี้ เราได้รับสตริงและจำนวนเต็ม 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