使用 C++ 按字典顺序打印长度为 M 的所有独特的环形字符串


在本问题中,给定一个字符串和一个整数 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

更新于: 2020-01-22

170 次浏览

开启你的 事业

完成课程便可获得认证

开始学习
广告