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;
}

浙公网安备 33010602011771号