C++程序 查找字典顺序最小的字符串旋转|集1
写一个代码,在一个循环数组中找到字典序最小的,例如:对于数组BCABDADAB,字典序最小的是ABBCABDAD。
更多示例:
输入: GEEKSQUIZ
输出: EEKSQUIZG
输入: GFG
输出: FGG
输入: GEEKSFORGEEKS
输出: EEKSFORGEEKSG
下面是一种简单的解决方案。假设给定的字符串为“str”
1)将“str”连接到它自己上,并将其存储在临时字符串“concat”中。
2)创建一个字符串数组来存储“str”的所有旋转。让数组为“arr”。
3)通过在索引0、1、2..n-1处获取“concat”的子字符串来查找“str”的所有旋转。将这些旋转存储在arr []中
4)对arr []进行排序并返回arr [0]。
下面是上述解决方案的实现。
//一个查找给定字符串的字典序最小旋转的简单C++程序
#include <iostream>
#include <algorithm>
using namespace std;
//此函数返回str的字典序最小旋转
string minLexRotation(string str)
{
//找出给定字符串的长度
int n = str.length();
//创建一个字符串数组来存储所有旋转
string arr [n];
//创建一个字符串的连接
string concat = str + str;
//一个一个地将str的所有旋转存储在数组中
//通过得到concat的子字符串来获得旋转
for(int i = 0; i < n; i ++)
arr [i] = concat.substr(i,n);
//排序所有旋转
sort(arr,arr + n);
//从排序数组中返回第一个旋转
return arr [0];
}
//驱动程序来测试上面的功能
int main()
{
cout << minLexRotation(“GEEKSFORGEEKS”)<< endl;
cout << minLexRotation(“GEEKSQUIZ”)<< endl;
cout << minLexRotation(“BCABDADAB”)<< endl;
}
输出:
EEKSFORGEEKSG
EEKSQUIZG
ABBCABDAD
上述解决方案的时间复杂度为O(n 2 logn),假设我们使用了O(nLogn)排序算法。