字符串最小表示(超时及优化)

探讨如何通过算法确定一个给定字符串围成圈后的最小字典序表示,并找到该表示在原字符串中的起始位置。文章提供了一个优化过的代码示例,用于处理多种测试数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】

把一个长为len的字符串围成一个圈,然后以任意一个字符作为起点,都会产生一个长为len的字符串,字符串的最小表示就是所有字符串中字典序最小的那个。
例如字符串alabala,将它围成一个圈后,根据上面的规则会形成以下新的字符串:
labalaa
abalaal
balaala
alaalab
laalaba
aalabal
在这所有7个字符串中,字典序最小的是aalabal,它的第一个字母在原字符串中的位置是6。(位置从0开始算)
现在给定你一个字符串,请你找出其最小表示的第一个字母在原字符串中的位置。如果字符串最小表示有多个,那么输出第一个字母在原字符串中位置最小的。

【条件限制】

时间限制: 1 Sec  内存限制: 32 MB

【输入】

输入的第一行是一个整数t,表示有t组测试数据。
接下来t行,每行先输入一个整数l(5<=l<=100000),表示原字符串的长度,然后输入一个字符串,表示原字符串。字符串中只包含小写字母。

【输出】

对于每组输入,输出原字符串最小表示的第一个字母在原字符串中的位置。

【输入样例】

2
6 baabaa
7 alabala

【输出样例】

1
6

【优化】

在输入一个字符串之后,先找到该字符串的最小字母,然后对于不是以最小字母开头的字符串省略对其判断,然后代码的运行时间就由原来的2976ms变成了700ms,优化结果并不理想但是ac是够了的,今后若有更好的优化措施再来补充。

【代码】

#include<iostream>
using namespace std;
int main(){
    int n,i,j,len,minpos,nn;
    string str,str1,minstr;
    char minch='z';
    cin>>n;
    for(i=0;i<n;i++){
        cin>>nn>>str;
        len=str.length();
        minstr=str;
        minpos=0;
        for(j=0;j<len;j++){
            if(minch>str[j])
                minch=str[j];
        }
        for(j=1;j<len;j++){
            if(str[j]==minch){
                str1=str.substr(j,len-j)+str.substr(0,j);
                if(minstr>str1){
                    minstr=str1;
                    minpos=j;
                }
            }
        }
        printf("%d\n",minpos);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值