字符串最小表示法

字符串最小表示法

其实就是用双指针进行一个自我比较。 模板:


#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;
    int original_length = s.size();

    // 将每个字符添加到字符串的末尾
    for (int i = 0; i < original_length; i++) {
        s.push_back(s[i]);
    }

    // 输出新的字符串
    for (int i = 0; i < s.size(); i++) {
        cout << s[i];
    }
    cout << endl;

    // 初始化变量 n 为原始字符串的长度
    int n = original_length;
    int i = 0, j = 1;

    // 使用双指针法找到最小字典序的子串
    while (i <= n && j <= n) {
        int k;
        for (k = 0; k < n && s[i + k] == s[j + k]; k++);
        if (k == n) break; // 如果找到了一个匹配的子串,退出循环
        if (s[i + k] > s[j + k]) {
            i = i + k + 1; // 移动 i 指针
            if (i <= j) i = j + 1; // 确保 i 和 j 不重叠
        }
        else {
            j = j + k + 1; // 移动 j 指针
            if (i >= j) j = i + 1; // 确保 i 和 j 不重叠
        }
    }

    // 输出最小字典序的子串
    for (int r = i; r < i + n; r++) {
        cout << s[r];
    }
    cout << endl;

    return 0;
}
    
posted @ 2024-12-12 11:15  安娜アンナ  阅读(27)  评论(0)    收藏  举报