概述
问题 H: 字符串最小表示
时间限制: 1 Sec 内存限制: 32 MB提交: 7 解决: 5
[ 提交][ 状态][ 讨论版]
题目描述
把一个长为len的字符串围成一个圈,然后以任意一个字符作为起点,都会产生一个长为len的字符串,字符串的最小表示就是所有字符串中字典序最小的那个。
例如字符串alabala,将它围成一个圈后,根据上面的规则会形成以下新的字符串:
labalaa
abalaal
balaala
alaalab
laalaba
aalabal
在这所有7个字符串中,字典序最小的是aalabal,它的第一个字母在原字符串中的位置是6。(位置从0开始算)
现在给定你一个字符串,请你找出其最小表示的第一个字母在原字符串中的位置。如果字符串最小表示有多个,那么输出第一个字母在原字符串中位置最小的。
例如字符串alabala,将它围成一个圈后,根据上面的规则会形成以下新的字符串:
labalaa
abalaal
balaala
alaalab
laalaba
aalabal
在这所有7个字符串中,字典序最小的是aalabal,它的第一个字母在原字符串中的位置是6。(位置从0开始算)
现在给定你一个字符串,请你找出其最小表示的第一个字母在原字符串中的位置。如果字符串最小表示有多个,那么输出第一个字母在原字符串中位置最小的。
输入
输入的第一行是一个整数t,表示有t组测试数据。
接下来t行,每行先输入一个整数l(5<=l<=100000),表示原字符串的长度,然后输入一个字符串,表示原字符串。字符串中只包含小写字母。
接下来t行,每行先输入一个整数l(5<=l<=100000),表示原字符串的长度,然后输入一个字符串,表示原字符串。字符串中只包含小写字母。
输出
对于每组输入,输出原字符串最小表示的第一个字母在原字符串中的位置。
样例输入
2
6 baabaa
7 alabala
样例输出
1
6
提示
分析:直接模拟的话会时间超限,所以先选出字符串中字典序最小的那个字符,然后不是这个字符开头的就直接跳过,优化一下就好了
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int n;
string a;
int record;
while(t--)
{
string c="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
cin>>n>>a;
char MIN='z';
int l=a.length();
for(int i=0; i<l; i++)
{
MIN=min(MIN,a[i]);
}
for(int i=0; i<l; i++)
{
if(a[i]==MIN)
{
string b=a.substr(i,n)+a.substr(0,i);
if(c>b)
{
c=b;
record=i;
}
}
}
cout<<record<<endl;
}
return 0;
}
最后
以上就是高挑鞋垫为你收集整理的字符串水题(substr的使用+简单优化)的全部内容,希望文章能够帮你解决字符串水题(substr的使用+简单优化)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复