Circular Sequence

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 1584


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 。

感受:
这题的棘手之处在于如何处理环,算法的第三步处理地非常巧妙。


龙威昊
4 声望5 粉丝