UVA 1584

这道题是个大水题,是我太渣了,在写算法排字典序的时候忘记只要两个字符串不相等就会出比较结果这个常识。然后我就一直卡在这里。。。

这个题有一个亮点,那就是所给字符串的n种形态相互对比的时候n种字符串的转换。最开始的时候我想先生成n个字符串再排序找出字典序最小的字符串,但是意识到这个花的时间有点长,然后借鉴了刘汝佳所给的思路,设置两个字符串,一个储存初始字符串,一个储存最小字符串,然后用选择排序法的思想将第一个字符串设为最小串,然后从n个字符逐个边生成新字符串边并做判断,只要发现某个字符和对应位置上的最小链的字符不一致则刷新最小串。

后来我又对其进行优化,得到的可选处理这种问题的思路是:

用一个循环遍历整个字符串的各个字符,并以该字符为新串的基点但只调用对应的字符不生成新串,逐个对比最小串和当前串相应位置的字符,如果不同就停止比较,然后视情况刷新最小串。

下附代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

string line1, line2;
int len;

void cmp(int pos)
{
    bool key = false;
    //string mid = "";
    int mid = pos;
    for(int i = 0; i < len; i++, pos++)
    {
        char letter1 = line1[pos % len];
        char letter2 = line2[i];
       // cout << letter1 << " " << letter2 <<  endl;
        if(letter1 < letter2)
        {
            key = true;
            break;
        }
        else if(letter1 > letter2)
        {
            break;
        }
    }
    if(key)
    {
        for(int i = 0; i < len; i++, mid++)
        {
            line2[i] = line1[mid % len];
        }
    }
}

void Test()
{
    line2 = line1;
    for(int i = 1; i < len; i++)
    {
        cmp(i);
       // cout << endl;
    }
}

int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        cin >> line1;
        len = line1.size();
        Test();
        cout << line2 << endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值