字符串_最小表示法题目

给出一个字符串,输出其本身以及其循环位移字典序最小的字符串

点击查看代码
#include <bits/stdc++.h>
using namespace std;


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        string a;
        cin >> a;
        int n = a.size();
        a += a;
        int i = 0, j = 1;
        int k = 0;
        while (i < n && j < n && k < n) {
            if (a[i + k] == a[j + k]) {
                k++;
            } else {
                if (a[i + k] > a[j + k]) {
                    i = i + k + 1;
                    if (i == j) {
                        i++;
                    }
                    k = 0;
                } else {
                    j = j + k + 1;
                    if (i == j) {
                        j++;
                    }
                    k = 0;
                }
            }
        }
        int s = min(i, j);
        for (int q = s; q < s + n; q++) {
            cout << a[q];
        }
        cout << "\n";
    }

    return 0;
}

需要注意的点是 1.直接用两个原字符串累加,方便循环位移 2.正如代码中所展示的,有两个起点ij,k代表长度,如果出现了不等于的情况,i或j的后k位都不需要比较了,因为本身就是保证这k位都是一致的,没有比较的意义,从这k位开始进行比较在第k+1位还是会遇到同样的不相等的情况
posted @ 2026-07-14 17:18  hybrz  阅读(0)  评论(0)    收藏  举报