我是靠谱客的博主 高挑鞋垫,这篇文章主要介绍字符串水题(substr的使用+简单优化),现在分享给大家,希望可以做个参考。

问题 H: 字符串最小表示

时间限制: 1 Sec   内存限制: 32 MB
提交: 7   解决: 5
[ 提交][ 状态][ 讨论版]

题目描述

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

输入

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

输出

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

样例输入

复制代码
1
2
3
2 6 baabaa 7 alabala

样例输出

复制代码
1
2
1 6

提示


分析:直接模拟的话会时间超限,所以先选出字符串中字典序最小的那个字符,然后不是这个字符开头的就直接跳过,优化一下就好了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部