Circular Sequence
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
https://uva.onlinejudge.org/i...
Accepted Code
// Author : Weihao Long
// Created : 2017/12/14
#include "stdio.h"
#include "string.h"
#define MAX 220
int main() {
int t;
scanf("%d", &t);
while (t--) {
char str[MAX], ans[MAX];
scanf("%s", str);
int len = strlen(str);
strcpy(ans, str);
strcat(str, ans);
for (int i = 0; i < len; i++)
if (strncmp(ans, str + i, len) > 0)
strncpy(ans, str + i, len);
puts(ans);
}
return 0;
}
Notes
题意:
给你一个环状字符串,你可以从任意起点开始读,要求找出字典序最小的字符串。
算法:
第一步:开两个数组(注意这里开了两倍于题目要求的长度), str 存放输入的串, ans 存放将要输出的答案。
第二步:把 str 复制到 ans 中,作为初始答案。
第三步:把 ans 接到 str 后,形成“环”。
第四步:遍历环,将“从环的第 i 个字母开始的长度为 len 的串”作为备选答案与 ans 比较,若字典序更小,则更新答案 ans 。
感受:
这题的棘手之处在于如何处理环,算法的第三步处理地非常巧妙。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。