一道水题,我用的将能够生成的所有string都存在vector里,然后开始遍历其中每一个,利用C++字符串可以进行比较的特性输出结果,对单个字符串来说,假设其长度为n,则复杂度为o(n*n);
汝佳大佬的程序直接用了下标,看起来简洁,但是复杂度也是o(n*n)。
第一个是我的程序。
#include <bits/stdc++.h>
using namespace std;
vector<string> v;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string ori;
int n;
cin>>n;
while (n--) {
string ts="";
cin>>ori;
int len=ori.size();
for (int i=0;i<len;i++) {
int j=i,cnt=0;
while (cnt<len) {
ts+=ori[j%len];
j++,cnt++;
}
v.push_back(ts);
ts="";
}
string ans(len,‘Z‘);
for (unsigned i=0;i<v.size();i++)
if (ans>v[i]) ans=v[i];
cout<<ans<<endl;
v.clear();
}
return 0;
}
下面是汝佳大佬的程序,我按他的思路写的,没看他的代码
#include <bits/stdc++.h>
#define N 105
using namespace std;
bool Less(const char *s,int p,int q) {
int n=strlen(s);
for (int i=0;i<n;i++) {
if (s[(p+i)%n]!=s[(q+i)%n])
return s[(p+i)%n]<s[(q+i)%n];
}
return 0;
}
int main() {
int n;
char s[N];
scanf("%d",&n);
while (n--) {
scanf("%s",s);
int ans=0,len=strlen(s);
for (int i=1;i<len;i++)
if (Less(s,i,ans)) ans=i;
for (int i=0;i<len;i++)
printf("%c",s[(ans+i)%len]);
printf("\n");
}
return 0;
}
例题3-6 Circular Sequence UVA - 1584
原文:https://www.cnblogs.com/yichuan-sun/p/9636354.html