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

พิมพ์สตริงวงกลมที่มีความยาว M ทั้งหมดตามลำดับศัพท์ในภาษา C++


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