7段第二课:贪心

最小字典序

题目&解法

题目:给定一个长度为 \(n\) 的字符串 \(s\)

每次可以从 \(s\) 的开头或者结尾取出一个字符,放到一个 \(t\) 字符串的尾部。

输出字典序最小的 \(t\) 字符串,每 \(80\) 个字符换一行输出。

解法:维护左右指针(端点),贪心向里面缩,选取较小的那个。

值得注意的是:如果左右指针的字符相同,就向里面缩,缩到不相等的位置,这个时候如果左边小就选取原来的左边的,右边小就选取原来右边的

一句话就是不等选小的,相等向里缩确保先选小的

Code

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    string s;
    cin >> n >> s;
    int l = 0, r = n - 1;
    string t;
    while (r - l >= 0) {
        if (s[l] < s[r]) t += s[l], l++;
        else if (s[l] > s[r]) t += s[r], r--;
        else {
            int x = l, y = r;
            while(s[x] == s[y] && r - l >= 0) x++, y--;
            if (s[x] < s[y]) t += s[l], l++;
            else t += s[r], r--; 
        }
    }
     for (int i = 0; i < t.size(); i++) {
        cout << t[i];
        if ((i + 1) % 80 == 0) cout << endl;
    }
    return 0;
}
posted @ 2025-11-23 15:00  sxr1023  阅读(1)  评论(0)    收藏  举报