例题3-6 Circular Sequence UVA - 1584

一道水题,我用的将能够生成的所有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;
}

猜你喜欢

转载自www.cnblogs.com/yichuan-sun/p/9636354.html